所以我有很多电影数据库表(电影,电影人,人物,人物电子邮件,角色,电影人物,流派)。
我想输出尽可能多的信息。例如,一行是:
Title | Date | Budget | Actor | Director | Genre |
Alien | 1923 | 3322 | someActor | someDirector | Scifi
SELECT Films.Title, Films.Date, Films.Budget, Persons.FirstName, Persons.LastName, Roles.RoleName, Genres.Name
FROM Films INNER JOIN
FilmPersons ON Films.FilmID = FilmPersons.FilmID INNER JOIN
Persons ON FilmPersons.PersonID = Persons.PersonID INNER JOIN
Roles ON FilmPersons.RoleID = Roles.RoleID INNER JOIN
FilmGenres ON Films.FilmID = FilmGenres.FilmID INNER JOIN
Genres ON FilmGenres.GenreID = Genres.GenreID
但是上面的结果并没有显示有关电影的所有信息,如何更改SQL以便我可以选择所有字段?
答案 0 :(得分:2)
基本上,我认为在这种情况下你应该使用 LEFT JOIN 而不是 INNER JOIN :
SELECT Films.Title,
Films.Date,
Films.Budget,
Persons.FirstName,
Persons.LastName,
Roles.RoleName,
Genres.Name
FROM Films LEFT JOIN FilmPersons ON Films.FilmID = FilmPersons.FilmID
INNER JOIN Persons ON FilmPersons.PersonID = Persons.PersonID
INNER JOIN Roles ON FilmPersons.RoleID = Roles.RoleID
LEFT JOIN FilmGenres ON Films.FilmID = FilmGenres.FilmID
INNER JOIN Genres ON FilmGenres.GenreID = Genres.GenreID
使用LEFT JOIN时,
FROM Films **LEFT JOIN** FilmPersons ON Films.FilmID = FilmPersons.FilmID
这将确保电影是主要的收藏品,甚至还缺少一些FilmPersons的价值。如果您使用的是 INNER JOIN ,则查询的最终结果将是 Intersection 。
我不确定我的解释是否可以解释..
答案 1 :(得分:0)
影片中的每一行都会发生,SQL Server将尝试在文件管理器中查找匹配的行(如果找不到匹配的行,则会将空值置于不匹配的值中),依此类推。在找到匹配的地方,它会将它找到的值放在匹配的列中,否则它会在这些列中放置空值。
SELECT Films.Title,
Films.Date,
Films.Budget,
Persons.FirstName,
Persons.LastName,
Roles.RoleName,
Genres.Name
FROM Films LEFT JOIN FilmPersons ON Films.FilmID = FilmPersons.FilmID
left JOIN Persons ON FilmPersons.PersonID = Persons.PersonID
left JOIN Roles ON FilmPersons.RoleID = Roles.RoleID
LEFT JOIN FilmGenres ON Films.FilmID = FilmGenres.FilmID
left JOIN Genres ON FilmGenres.GenreID = Genres.GenreID