访问左连接无法正常工作,因为我正在想象它

时间:2015-06-25 17:14:07

标签: sql ms-access left-join

我正在尝试编写一个涉及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"

感谢。

1 个答案:

答案 0 :(得分:0)

我有一种感觉,因为你的联接中的子句正在进行布尔检查,而不是匹配表之间的记录,即。

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