2014-10-20 178 views
1

我試圖讓only selected rows from table A(不是所有行)和rows matching table A from table B,但它顯示了從表A和表只有B匹配的行,從表A包括選定行的其餘部分

我用這種條件下,
LEFT JOIN與where子句不工作

SELECT A.CategoryName,B.discount 
    from A LEFT JOIN B ON A.CategoryCode = B.CategoryCode 
    WHERE A.itemtype='F' and B.party_code=2 



我有2個表:

表1:A 3列
類別名稱,CategoryCode(PK)的ItemType

表2:B 2列
CategoryCode(FK),折扣,PartyCode(FK)(from another table

注:訪問工作2007年

回答

1

對於來自表B的非匹配行,party_code = NULL,所以您的where子句將計算爲false,因此該行將不會返回。所以,你需要在加入前過濾「B」記錄。嘗試

SELECT A.CategoryName,B.discount 
    from A LEFT JOIN B ON A.CategoryCode = B.CategoryCode and B.party_code=2 
    WHERE A.itemtype='F' 

[編輯]在Access中不起作用。下一次嘗試。

您可以創建一個查詢來完成您的過濾器。我們稱之爲「B_filtered」。這只是

SELECT * FROM B where party_code = 2 

(你可以使「2」的參數,使其更加靈活)。

然後,只需在您的實際查詢中使用此查詢。

SELECT A.CategoryName,B_filtered.discount 
    from A LEFT JOIN B_filtered ON A.CategoryCode = B_filtered.CategoryCode 
    WHERE A.itemtype='F' 

[編輯]

只是一派 - 我認爲你可以直接使用子查詢做到這一點。

SELECT A.CategoryName,B_filtered.discount 
     from A LEFT JOIN (SELECT * FROM B where party_code = 2) AS B_filtered ON A.CategoryCode = B_filtered.CategoryCode 
     WHERE A.itemtype='F' 
+0

感謝您的答覆。但它不起作用。它給出'不支持JOIN表達式'的錯誤。 – Steve 2014-10-20 14:19:23

+1

我的不好...它適用於其他SQL風格。讓我再嘗試一次。 – mlinth 2014-10-20 14:21:30

+0

謝謝你的嘗試。 – Steve 2014-10-20 14:36:12

1

mlinth的建議是正確的,並且適用於大多數其他SQL語言。下面的查詢是相同的基本概念,但使用空條件。

嘗試:

SELECT A.CategoryName,B.discount 
from A LEFT JOIN B ON A.CategoryCode = B.CategoryCode 
WHERE A.itemtype='F' and (B.party_code=2 OR B.party_code IS NULL) 

如果party_code是可空的,切換到使用PK或另一非可空字段。

+0

它工作,但部分。現在它顯示了一些行,但仍有一些丟失。例如:如果有15行「A.itemtype ='F'',它只顯示10行,缺少5行。 – Steve 2014-10-20 14:31:53

+0

其他5與party_code <> 2? – AWinkle 2014-10-20 14:35:03

+0

是的。其他5沒有與party_code 2相關的任何內容。 – Steve 2014-10-20 14:38:21