与 where 子句不工作的左连接
Posted
技术标签:
【中文标题】与 where 子句不工作的左连接【英文标题】:Left join with where clause not working 【发布时间】:2014-10-20 14:06:38 【问题描述】:我试图获取 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 列
CategoryName,CategoryCode(PK),ItemType
表 2:B
有 2 列
CategoryCode(FK),Discount,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'
【讨论】:
感谢您的回复。但它不起作用。它给出了JOIN expression not supported
的错误。
所以你是说我应该创建另一个 B_filtered 表?
否 - 在 Access 中,您可以创建查询并保存。然后您可以在其他查询中使用 that 查询(就像您使用表一样)...如果您在第一个查询中使用参数,您可以提取任何您想要的 party_code...跨度>
是的,它有效。但是我们如何在不创建单独查询的情况下做到这一点呢?【参考方案2】:
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 或其他不可为空的字段。
【讨论】:
它有效,但部分有效。现在它显示了一些行,但仍有一些行丢失。例如:A.itemtype='F'
类型有 15 行,则只显示 10 行,缺少 5 行。
是的。其他 5 个与party_code 2 没有任何关系。
如果 B.Party_Code = 2,A 是否应该在没有 B 的情况下显示?以上是关于与 where 子句不工作的左连接的主要内容,如果未能解决你的问题,请参考以下文章
SQL左连接与JOIN条件中的过滤器与WHERE子句中的过滤器[重复]
如何在 EF / EF Core 中的第二个表上实现具有某些条件的左连接?
使用内连接,左外连接,交叉应用获取语法错误与 Where 子句