【问题标题】:Left join with where clause not working与 where 子句不工作的左连接
【发布时间】: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 年访问

【问题讨论】:

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


    【解决方案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 的情况下显示?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多