2015-06-25 221 views
0

我想写一个查询,涉及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" 

感谢。

回答

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 
+0

这里的问题是,Card.Enabled和F_CARD.END_DT是NULL不属于“Where”条件,除非我指定所有可能性。 – user2859406