【问题标题】:Access left join not working as I am picturing it访问左连接不起作用,因为我正在想象它
【发布时间】:2015-06-25 17:14:06
【问题描述】:

我正在尝试编写一个涉及 3 个表的查询,并将其中两个表连接到一个主表上。

SELECT UNIT_MAIN.UNIT_NO, DEPT_MAIN.LEV_2, Card.CardNumberLong AS [Some
Number], Card.Enabled, F_CARD.CARD_NO, F_CARD.END_DT
FROM (((UNIT_MAIN 
INNER JOIN DEPT_MAIN ON UNIT_MAIN.USING_DEPT = DEPT_MAIN.DEPT_ID) 
LEFT JOIN Card ON (UNIT_MAIN.UNIT_NO = Card.UnitCode AND Card.Enabled = True) )
LEFT JOIN F_CARD ON (UNIT_MAIN.UNIT_ID = F_CARD.ASSIGNED_ID AND (F_CARD.END_DT) Is Null  ))
WHERE  (((UNIT_MAIN.STATUS)="A") AND ((DEPT_MAIN.LEV_2)="AM") AND ((Card.Enabled)=True) ) 
OR (((UNIT_MAIN.STATUS)="D") AND ((DEPT_MAIN.LEV_2)="AM") AND ((Card.Enabled)=True) ) 

我遇到的问题是,当 F_CARD 表中有 F_CARD.END_DT 不为空的行时,导致主表(单元表)不显示,即使它是左连接并且 F_CARD 表行不满足加入条件(或者我相信)。

我在 F_CARD 表上没有任何 where 子句,它们仅适用于连接条件。

编辑 当我执行

LEFT JOIN MFIVE_F_CARD ON (MFIVE_UNIT_DEPT_COMP_MAIN.UNIT_ID = MFIVE_F_CARD.ASSIGNED_ID AND ((MFIVE_F_CARD.END_DT) Is Null)

如果 F_CARD 表包含具有 END_DT 的行,则单元不会出现,我相信由于左连接条件失败,内表(单元表)无论如何都应该出现。

如果我从查询中删除任何与 F_CARD 相关的值,则会出现我正在寻找的缺失单位。它是内连接、左连接、左连接。当第二个左连接发生时,即使它们应该出现,我也会丢失行。

我缩小了我的连接范围,只是用 F_CARD 做了左边的内部。试图看看为什么它不返回连接失败的行。

尝试执行以下操作,但我得到一个不受支持的连接错误...

SELECT 
    UNIT_MAIN.UNIT_NO
    ,DEPT_MAIN.LEV_2
    ,Card.CardNumberLong AS [SomeNumber]
    ,Card.Enabled
    ,F_CARD.CARD_NO
    ,F_CARD.END_DT FROM 
    (
        (
            (
                UNIT_MAIN 
                INNER JOIN DEPT_MAIN
                ON UNIT_MAIN.USING_DEPT = DEPT_MAIN.DEPT_ID
            ) 
            LEFT JOIN Card
            ON  (UNIT_MAIN.UNIT_NO = Card.UnitCode AND Card.Enabled = True)
        ) 
        LEFT JOIN F_CARD
        ON (UNIT_MAIN.UNIT_ID = F_CARD.ASSIGNED_ID AND F_CARD.END_DT Is Null)
    ) WHERE 
    (UNIT_MAIN.STATUS = "A" OR UNIT_MAIN.STATUS = "D")
    AND DEPT_MAIN.LEV_2 = "AM"

谢谢。

【问题讨论】:

    标签: sql ms-access left-join


    【解决方案1】:

    我感觉这是因为您的联接中有子句进行布尔检查而不是匹配表之间的记录,即

    Card.Enabled = True(F_CARD.END_DT) IS NULL

    尝试将查询更改为:

    SELECT 
        UNIT_MAIN.UNIT_NO
        ,DEPT_MAIN.LEV_2
        ,Card.CardNumberLong AS [SomeNumber]
        ,Card.Enabled
        ,F_CARD.CARD_NO
        ,F_CARD.END_DT
    FROM 
        (
            (
                (
                    UNIT_MAIN 
                    INNER JOIN DEPT_MAIN
                    ON UNIT_MAIN.USING_DEPT = DEPT_MAIN.DEPT_ID
                ) 
                LEFT JOIN Card
                ON  UNIT_MAIN.UNIT_NO = Card.UnitCode
            ) 
            LEFT JOIN F_CARD
            ON UNIT_MAIN.UNIT_ID = F_CARD.ASSIGNED_ID
        )
    WHERE 
        (UNIT_MAIN.STATUS = "A" OR UNIT_MAIN.STATUS = "D")
        AND DEPT_MAIN.LEV_2 = "AM" 
        AND Card.Enabled = True
    

    【讨论】:

    • 这里的问题是 Card.Enabled 和 F_CARD.END_DT IS NULL 不属于“Where”条件,除非我指定所有可能性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 2021-11-11
    • 1970-01-01
    • 2012-09-10
    相关资源
    最近更新 更多