如何从多个表中获取所有记录,甚至是没有值的表

时间:2015-04-08 00:34:08

标签: sql sql-server sql-server-2008-r2

所以我有很多电影数据库表(电影,电影人,人物,人物电子邮件,角色,电影人物,流派)。

我想输出尽可能多的信息。例如,一行是:

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以便我可以选择所有字段?

2 个答案:

答案 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