[英]SQL LEFT JOIN and WHERE yields unexpected result
我有兩個與名為“狀態”的字段相關的表。 如果table2.location的值為“ texas”,則有20個table2.status實例的值為“ good”。
也就是說,以下查詢返回table2.status ='good'的20行。
[A] SELECT table2.status FROM table2 WHERE table2.location = 'texas';
此外,還有50個唯一的table1.id,其中table1.status ='good'。
也就是說,以下查詢返回50行唯一的table1.id。
[B] SELECT table1.id FROM table1 WHERE table1.status = 'good';
現在,當我運行以下查詢時:
[C] SELECT table1.id FROM table1 LEFT JOIN table2 ON table1.status = table2.status WHERE table2.location = "texas";
我希望它返回50行唯一ID。 但是,它實際上是返回50行唯一ID的20次(即,我返回了1000行)。
我所做的快速修復是簡單地執行SELECT DISTINCT table1.id ...,然后僅返回一組50行(而不是20組50行)。
但是,我想知道為什么會看到這種行為-我的查詢[C]可能有問題嗎?
謝謝!
如果要獲取50個項目,則您的查詢是錯誤的:您正在執行50x20的交叉聯接,因此您有1000條記錄。
您無法加入狀態(這不是唯一的):可能您的表設計錯誤。
IMO,您應該在兩個表中都具有id並將其加入...
這是預期的。 表1的第一行匹配表2的50行,表1的第二行再次匹配表2的相同50行,依此類推。
您的查詢有兩個問題
SELECT table1.id
FROM table1
LEFT JOIN table2 ON table1.status = table2.status
WHERE table2.location = "texas";
首先,當您使用左聯接時,第二個表上的條件必須位於ON子句中,而不是where子句中,或者您將左聯接轉換為內部聯接(因為必須滿足條件)
因此,您的查詢應開始如下所示:
SELECT table1.id
FROM table1
LEFT JOIN table2
ON table1.status = table2.status
AND table2.location = "texas";
現在,您的下一個問題是身份不太可能成為您真正想要加入的對象。 為了幫助您獲得所需的結果,我們需要查看兩個表的表結構。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.