2013-07-04 59 views
0

我有兩張表,一個是人,另一個是每個人擁有的各種狗。我只想查詢一次數據庫。SQL加入 - 顯示錶,即使第二個加入的表沒有相關

我想總是展示活躍的人,即使他們沒有任何附加在他們身份證上的狗。我將如何查詢?

SELECT person.*, dog.* 
FROM person 
LEFT OUTER JOIN dog ON person.id = dog.person_id AND 
WHERE person.active=true and dog.active=true 
+1

此查詢不起作用,因爲連接中有額外的AND。這也是你的問題的答案.... :) – GolezTrol

+0

它是在'WHERE'或'ON'子句中的WHERE之前的額外'AND'嗎?有重要的區別需要了解... – IMSoP

回答

4

將條件移至連接(on子句);通過這種方式,您將加入與person_idactive標誌均匹配的記錄。如果未找到有效的dog,則person仍存在於結果中。

如果您在where子句中添加條件,首先LEFT JOIN評估,然後是不活躍的狗(包括那些沒有在所有狗)的所有記錄都被過濾掉。如果你這樣做,它可以有效地將你的left join變成inner join

SELECT 
    person.*, 
    dog.* 
FROM 
    person 
    LEFT JOIN dog ON person.id = dog.person_id AND dog.active=true 
WHERE 
    person.active=true 
+0

移動它如何更改查詢的輸出 –

+1

因爲您將留下任何匹配person_id和活動標誌的記錄。如果找不到狗,該人仍然存在於結果中。如果在'where'子句中添加條件,則首先評估左連接,然後將所有不是活動狗的記錄(包括根本沒有狗的記錄)過濾掉。如果你這樣做,它可以有效地將你的左連接變成一個內連接。 – GolezTrol

+0

@SabashanRagavan由於在'OUTER JOIN'(又名'LEFT JOIN' /'RIGHT JOIN')中,'ON'子句過濾*將使用連接表的哪些行*而WHERE子句過濾*最終結果組*。所以'WHERE'條款中的一個條件將沒有狗的人移除,因爲它不匹配;在「ON」條款中,它只是刪除狗,讓人們離開。 – IMSoP