我有兩張表,一個是人,另一個是每個人擁有的各種狗。我只想查詢一次數據庫。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
我有兩張表,一個是人,另一個是每個人擁有的各種狗。我只想查詢一次數據庫。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
將條件移至連接(on
子句);通過這種方式,您將加入與person_id
和active
標誌均匹配的記錄。如果未找到有效的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
移動它如何更改查詢的輸出 –
因爲您將留下任何匹配person_id和活動標誌的記錄。如果找不到狗,該人仍然存在於結果中。如果在'where'子句中添加條件,則首先評估左連接,然後將所有不是活動狗的記錄(包括根本沒有狗的記錄)過濾掉。如果你這樣做,它可以有效地將你的左連接變成一個內連接。 – GolezTrol
@SabashanRagavan由於在'OUTER JOIN'(又名'LEFT JOIN' /'RIGHT JOIN')中,'ON'子句過濾*將使用連接表的哪些行*而WHERE子句過濾*最終結果組*。所以'WHERE'條款中的一個條件將沒有狗的人移除,因爲它不匹配;在「ON」條款中,它只是刪除狗,讓人們離開。 – IMSoP
此查詢不起作用,因爲連接中有額外的AND。這也是你的問題的答案.... :) – GolezTrol
它是在'WHERE'或'ON'子句中的WHERE之前的額外'AND'嗎?有重要的區別需要了解... – IMSoP