左连接where子句不起作用

时间:2014-10-20 14:06:39

标签: join ms-access-2007 left-join

我试图获取only selected rows from table A(并非所有行)和rows matching table A from table B,但它只显示来自表A和表B的匹配行,不包括表A中其他所选行。

我用这个条件,

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

注意:在Access 2007中工作

2 个答案:

答案 0 :(得分: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' 

[编辑]

Just Googled - 我认为您可以使用子查询直接执行此操作。

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' 

答案 1 :(得分: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或其他不可为空的字段。