J'ai trois tables (simplifiées)
movie(id int primary key identity, title varchar(20) not null) genre(id int primary key identity, type varchar(10) not null) movie_genre(movie_id int references movie(id), genre_id int references genre(id), primary key(movie_id, genre_id))
Données dans le film
id title --------------------------- 1 | Inception 2 | The Dark Knight
Données dans le genre
id type --------------------- 1 | action 2 | adventure 3 | thriller
Données dans movie_genre
movie_id genre_id ---------------------------- 1 | 1 1 | 2 2 | 1 2 | 3
Je veux afficher le nom du film avec ses types de genre affichés dans une colonne. Ainsi, la sortie serait
title | genres ----------------------------------------- Inception | action adventure The Dark Knight | action thriller
J'ai essayé de le faire de cette façon
select movie.title, genre.type from movie, genre where movie.id = movie_genre.movie_id and genre.id = movie_genre.genre_id;
mais il dit:
L'identificateur en plusieurs parties "movie_genre.movie_id" n'a pas pu être lié.
L'identificateur en plusieurs parties "movie_genre.genre_id" n'a pas pu être lié.
Je suis très nouveau à SQL, toute aide serait appréciée.
Modifier :
En utilisant
SELECT G.[Type] ,M.[Title] FROM movie_genre MG LEFT JOIN genre G ON MG.genre_id = G.ID LEFT JOIN movie M ON MG.Movie_ID = M.ID
OU
select movie.title, genre.type from movie, genre, movie_genre where movie.id = movie_genre.movie_id and genre.id = movie_genre.genre_id;
La sortie est maintenant,
title | genres ----------------------------------------- Inception | action Inception | adventure The Dark Knight | action The Dark Knight | thriller
Comment pourrais-je afficher les genres dans une rangée?
SELECT G.[Type] ,M.[Title] FROM movie_genre MG LEFT JOIN genre G ON MG.genre_id = G.ID LEFT JOIN movie M ON MG.Movie_ID = M.ID
SELECT DISTINCT M.[Title] ,STUFF(( SELECT ' ' + G.[Type] FROM genre G INNER JOIN movie_genre MG ON MG.genre_id = G.ID WHERE MG.Movie_id = Mov.Movie_id FOR XML PATH(''),TYPE) .value('.','NVARCHAR(MAX)'),1,1, '') Genre FROM movie_genre Mov INNER JOIN movie M ON Mov.Movie_ID = M.ID
SELECT DISTINCT M.[Title] ,STUFF(List,1,1, '') Genre FROM @movie_genre Mov INNER JOIN @movie M ON Mov.Movie_ID = M.ID CROSS APPLY ( SELECT ' ' + G.[Type] FROM @genre G INNER JOIN @movie_genre MG ON MG.genre_id = G.ID WHERE MG.Movie_id = Mov.Movie_id FOR XML PATH('') )Gen(List)
SQL FIDDLE
Je crois que vous devrez append le "movie_genre" à FROM, par exemple:
SELECT movie.title, genre.type FROM (movie, genre, movie_genre) WHERE ....