我试图获取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中工作
答案 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或其他不可为空的字段。