2010-03-03 64 views
5

給定一個數據庫有兩個表XY,我有一個查詢,應該LEFT JOIN屬性X.a1Y.b1上的兩個表。我用下面的查詢:MySQL問題:空表上的LEFT JOIN

SELECT X.a1, X.a2, Y.b1, Y.b2 FROM X LEFT JOIN Y ON (X.a1 = Y.b1) 

我認爲這會是足夠好的工作,即使Y目前是一個空表。但是,查詢中斷,因爲表Y是空的。有什麼辦法來重新格式化這個查詢,以便即使Y是一個空表,LEFT JOIN不會中斷嗎?或者我只需要始終確保表Y中有一些數據,即使它與表X(因此爲LEFT JOIN)中的任何內容不匹配。

+0

對不起,我編輯了表格,使其更有意義。我頭腦裏有一個想法,把它搞砸了。 – ashays 2010-03-03 17:31:50

+0

我有一個類似的問題,下面poh的解決方案爲我工作。 – jkinz 2013-08-02 15:27:08

回答

5

你的表名有點混亂。它是X和Y,還是X.a和Y.b?

如果X和Y:

SELECT X.a1, X.a2, Y.a1, Y.b2 FROM X LEFT OUTER JOIN Y ON (X.a1 = Y.b1) 

應帶回所有的X,用空的Y.a1和Y.b2在沒有匹配的記錄。

+1

你知道還有其他左連接嗎? :) LEFT JOIN =左外部連接 – Andrey 2010-03-03 17:05:16

+0

@Andrey IMO'OUTER'應該用在** outer **連接中,而不管RDBMS的快捷鍵。 – 2010-03-03 17:15:40

+0

我同意,但我認爲它在目前的問題沒有意義 – Andrey 2010-03-03 17:32:45

6

既然你沒有發佈你的實際SQL,我只是在這裏做出假設。我的經驗告訴我你可能有一個where子句導致SQL返回空集。

SELECT X.a1, X.a2, Y.b1, Y.b2 FROM X LEFT JOIN Y ON (X.a1 = Y.b1) 
WHERE Y.b3 = 'something' 

上述SQL將返回空結果集。您可能需要將SQL修改爲以下格式,方法是將有問題的where子句調出到LEFT JOIN ON子句。

SELECT X.a1, X.a2, Y.b1, Y.b2 FROM X 
LEFT JOIN Y ON (X.a1 = Y.b1 and Y.b3 = 'something') 
+0

謝謝你,我有一個類似的問題,並修復它! – jkinz 2013-08-02 15:26:34

+0

只是要清楚 - 這實際上不會根據Y'東西'過濾結果;它會返回一個結果集,對所有的Y'東西'都有NULL。 – user2426679 2014-04-29 16:59:53

0

嘗試在返回像 HeidiSQL或類似的錯誤一些SQL編輯您的查詢。在我的情況下,問題是在WHERE子句中含糊不清的id。