2016-11-29 71 views
1

我有以下查詢:SQL聯接返回領域與空值

SELECT * 
FROM tableA.A 
LEFT JOIN tableB AS B ON B.id=A.id 
LEFT JOIN tableC AS C ON C.id=A.id2 
LEFT JOIN tableD AS D ON D.id=A.id3 
WHERE D.id = '124' AND A.field = 1 
GROUP BY A.id ORDER BY D.sortorder 

上面的結構是同文同我真正的查詢,我想提一提,我在查詢中使用的所有表都有效和行填充數字和字母字符。任何地方都沒有NULL值。

的問題是,當我執行此查詢,則返回一個NULL值某些字段,即使它們不爲空。

我試圖解釋,因爲我可以一樣好,但它是一個奇怪的行爲,我無法找到任何谷歌。

如果它不是一個普遍的問題,很難發現其中的錯誤,也許一些建議會幫助我找到的bug。

預先感謝您

UPDATE我想apologize.The問題是由在桌子上一年底的進入造成的,這就是爲什麼它返回NULL,因爲實際上沒有match.Thank您的幫助

+1

切勿對'GROUP BY'使用'SELECT *'。這表明你不知道你在做什麼。 –

+0

@GordonLinoff,在我的代碼我用一些特定的領域,他們中的一些具有相同的名稱,這是集團的目的而 –

+0

@PeterCos - 這是相當混亂的念想,因爲正如所寫的,您的查詢就會拋出一個錯誤。對於我們來說,如果你輸入一些列名稱以及如何對它們進行分組,那麼對於我們來說會更容易。 – kbball

回答

1

嘗試此查詢:

SELECT * 
FROM tableA.A 
LEFT JOIN tableB AS B ON B.id=A.id 
LEFT JOIN tableC AS C ON C.id=A.id2 
LEFT JOIN tableD AS D ON D.id=A.id3 and D.id = '124' 
WHERE A.field = 1 
GROUP BY A.id 
ORDER BY COALESCE(D.sortorder,0) 

條件上LEFT JOIN的右表應放在ON子句中,而不是WHERE條款。

如果這也不行,那我的事,你誤會了LEFT JOIN目的。它用於保留全部來自主表的記錄(您的情況爲A)和丟棄所有與詳細表不匹配的數據,因此,在不匹配fouhd時會有NULL的值。

+0

如果我正在更改它,右表狀態不起作用。 –

+0

當您將條件放在WHERE而不是ON時,連接變成了INNER JOIN。您可以用另一個選擇來包裝查詢,然後對其進行過濾。 – sagi

+0

是的,我知道,但在D桌上,我得到的字段與id中的某個表相匹配,並且我使用另一個字段來提取一些匹配的字段,這就是D.id = 124的目的。但它不會返回我所需要的,因爲某些返回的字段在它們不應該時爲空。在D表中,這些值的值爲124 –