我查了很多類似的問題,但沒有人適用於Firebird,我想。如何選擇連接的行,即使沒有匹配?
我有兩個表;一個存儲客戶信息,第二個存儲庫存活動(其中還包括訂單)。我想提取所有客戶以及他們訂單的數量。但無論我如何加入訂單表,我最終只得到至少有一個訂單的客戶。這意味着在庫存活動表中沒有匹配的客戶將不會顯示在結果集中。
這是我運行的查詢;
SELECT
C.NAME, C.GROUPNAME, C.EMAIL,
COALESCE(COUNT(DISTINCT S.ORDERNO), '0') AS TOTALORDERS,
COALESCE(SUM(S.AMOUNT), '0') as TOTALREVENUE
FROM CUSTOMERS C
LEFT OUTER JOIN STOCK_ACTIVITY S ON C.ID = S.CUSTOMERID
WHERE C.GROUPNAME = 'B'
AND (S.TYPE = 'RECEIPT' OR S.TYPE = 'INVOICE')
GROUP BY C.NAME, C.GROUPNAME, C.EMAIL
沒有連接,我得到570行(客戶),它是正確的結果集。當我加入訂單表以獲取這些客戶的總訂單量時;我只得到379個結果;哪些是至少有一個訂單。這意味着沒有訂單的客戶將不會退貨。你可能已經猜到了;我想讓零活動的客戶返回「0」作爲訂單金額和收入。
謝謝;這已經完成了這項工作。雖然兩種不同的選擇產生了不同的結果。有趣的是,將過濾器連接到連接中產生比where子句少2行的內容。 – Turab
這可能意味着'STOCK_ACTIVITY'中有2條記錄,'TYPE'真*是*'NULL'。我想我應該指出,如果使用選項1,則需要將「真實記錄與某些」NULL「值區分開」形成「生成的」NULL記錄「。在大多數敏感的數據模型中,您可以通過檢查右表PK值是否爲NULL來做到這一點。或者肯定你可以測試連接鍵的右表值是否爲NULL(因爲an = join不會匹配這樣的記錄) –