Sql 如何从多个表中获取所有记录,即使是没有值的记录

Sql 如何从多个表中获取所有记录,即使是没有值的记录,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,所以我有很多电影数据库的表格(电影、电影人物、人物、个人邮件、角色、电影类型、类型) 我想输出所有的电影,尽可能多的信息存在。例如,一行是: Title | Date | Budget | Actor | Director | Genre | Alien | 1923 | 3322 | someActor | someDirector | Scifi 但是上面的结果并没有显示关于电影的所有信息,如何更改SQL以便我可以选择所有字段?基本上,我认为在这种情况下,您应该使用左连接而不是内部连接

所以我有很多电影数据库的表格(电影、电影人物、人物、个人邮件、角色、电影类型、类型)

我想输出所有的电影,尽可能多的信息存在。例如,一行是:

Title | Date | Budget | Actor | Director | Genre |  
Alien | 1923 | 3322 | someActor | someDirector | Scifi

但是上面的结果并没有显示关于电影的所有信息,如何更改SQL以便我可以选择所有字段?

基本上,我认为在这种情况下,您应该使用左连接而不是内部连接

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
使用左连接时

FROM Films **LEFT JOIN** FilmPersons ON Films.FilmID = FilmPersons.FilmID
这将确保电影是主要的收藏,甚至连一些有价值的电影人也不见了。如果您使用的是内部联接,则查询的最终结果将是交集


我不确定我的解释是否可以理解。

将要发生的是,对于电影中的每一行,SQL Server将尝试在FilePerson中查找匹配的行(如果找不到匹配的行,它将在不匹配的值中放置空值),等等。当它找到匹配项时,会将找到的值放在匹配列中,否则会将空值放在这些列中

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

我想我明白了。但是为了得到所有存在的电影(即使没有他们自己的表格提供的任何其他信息,如标题、日期和预算),我必须在所有事情上都加入。这有意义吗?此外,是否可以根据特定列“合并”行?i、 e.一个电影标题,但多个演员或类型->演员和/或类型用逗号(,)分隔的一行。是我的情况吗?可以根据特定列“合并”行,就像两列一样:一列是电影名称,另一列是不同演员的。但我想知道您是否只需要在SQL脚本中执行此操作?或者您可以通过网页或其他方式显示信息?如果你想在网页上显示电影信息,只需让后面的代码使用LEFT-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 
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