2015-04-08 28 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 
相關問題