与 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 子句

左外连接与右外连接区别?

如何使用 linq lambda 扩展方法执行带有 where 子句的左外连接

选择中的左连接与子查询的奇怪问题