簡體   English   中英

SQL LEFT JOIN和WHERE產生意外結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM