2012-02-15 86 views
0

我有兩個表與一個名爲'status'的字段相關。在table2.location的值爲'texas'的情況下,有20個table2.status實例的值爲'good'。SQL LEFT JOIN和WHERE產生意想不到的結果

也就是說,以下查詢返回20行table2.status ='good'。

[A] SELECT table2.status FROM table2 WHERE table2.location = 'texas'; 

此外,還有50個獨特的table1.id與table1.status = '好'。

也就是說,以下查詢返回50行唯一table1.id's。

[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行唯一標識的20次(即我返回了1000行)。

我做的快速修復只是簡單地執行SELECT DISTINCT table1.id ...然後只返回一組50行(不是20組50行)。

但是,我想知道爲什麼我看到這個行爲 - 也許我的查詢[C]有問題嗎?

謝謝!

回答

1

你的查詢有兩個問題

SELECT table1.id 
FROM table1 
LEFT JOIN table2 ON table1.status = table2.status 
WHERE table2.location = "texas"; 

首先,當你USAE左加入第二臺的條件必須是ON子句中的WHERE子句或將轉換爲左連接到內部連接(由於條件必須得到滿足)

所以您的查詢應該開始尋找這樣的:

SELECT table1.id 
FROM table1 
LEFT JOIN table2 
    ON table1.status = table2.status 
    AND table2.location = "texas"; 

現在你的下一個問題是,狀態不太可能成爲你真正想要加入的東西。爲了幫助您獲得所需的結果,我們需要查看兩個表的表結構。

2

如果您想獲得50個項目:您正在執行交叉連接50x20,因此您有1000條記錄作爲結果,您的查詢是錯誤的。
你無法加入狀態(這不是唯一的):可能你的餐桌設計是錯誤的。
國際海事組織你應該有兩個表中的編號,並加入它...

2

它是預期的。從表1中第一行從表2中,第二排50行從表1再次匹配匹配由表2等相同的50行