2015-04-08 18 views
0

因此,我为电影数据库(电影,电影人,人物,PersonEmails,角色,FilmGenres,流派)提供了很多表格。如何从多个表中获取所有记录,即使那些没有值的记录

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

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

基本上,我想你应该使用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

我不知道我的解释是可以理解的..

+0

我想我明白了。但为了获得所有存在的电影(即使没有任何其他信息比他们自己的表格提供标题,日期和预算),我必须加入所有内容。这有意义吗? 另外,是否有可能根据特定列“合并”行?即一个电影片名,但是许多演员或流派 - >一行,其中演员和/或流派由逗号(,)分开。是http://stackoverflow.com/questions/273238/how-to-use-group-by-to-concatenate-strings-in-sql-serverthis我的情况? – Tsafou

+0

根据特定的列可以“合并”行,就像两列:一个用于电影名称,另一个用于不同的演员。 但我想知道你只需要在SQL脚本中做到这一点?或者你可以通过网页显示信息或其他东西? 如果您要通过网页显示电影信息,只需让代码隐藏即可使用* LEFT JOIN *进行工作。这会更好。 –

0

请告诉我将要发生是在电影中的SQL Server中的每一行都会试图找到filepersons匹配的行(如果它没有找到一个匹配的行它会在不匹配的值中放置空值)等等。如果它发现匹配,它会将它在匹配列中找到的值放入其中,否则它将在这些列中放置空值。

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 
相关问题