使用WHERE子句的JOIN查询返回的结果少于MS Access中预期的结果

时间:2015-06-25 18:11:27

标签: sql ms-access

首先查询:

SELECT 
    TAB1.[CDNO], TAB1.[IDTNO], 
    IIF(ISNULL([TAB1.ECONIV3]), [TAB1.ECONIV2], 'none')  AS [CONTRIB] 
FROM 
    TAB1 
WHERE 
    (TAB1.[UNNN] <> "WATER" AND TAB1.[CCCCPP] <> "SALT") 
;

第二次查询:

SELECT 
 TAB1.[CDNO], TAB1.[IDTNO], IIF(ISNULL([TAB1.ECONIV3]), [TAB1.ECONIV2], 'none')  AS [CONTRIB] 
 , IIF(ISNULL([TAB2.ENTCOM3]), [TAB1.ENTCOM2],'none')  AS [CONCOM] , IIF(ISNULL([TAB2.ENTSTI3]), [TAB1.ENTSTI2],'none')  AS [CONSTI] 
 FROM
  TAB1
  LEFT OUTER JOIN TAB2  
  ON (TAB1.[IDTNO] = TAB2.[PTDINO] AND (IIF(ISNULL([TAB1.ECONIV3]), [TAB1.ECONIV2], 'none')  = IIF(ISNULL([TAB2.ENTSTI3]), [TAB1.ENTSTI2],'none'))
  WHERE ( TAB1.[UNNN] <> "WATER" AND TAB1.[CCCCPP] <> "SALT") 
;

TAB1的行数为TAB2的8倍。 如果第二个查询返回的行少于第一个查询,则表明存在问题。 所以我的问题是在第二个查询中,我试图获得所选TAB1列的所有行,另外还有两列来自 TAB2与2 OUTER JOIN条件匹配。

1 个答案:

答案 0 :(得分:0)

第二个查询不应该运行,因为它有一个奇数个括号(意味着你缺少一个),根据你在这里说的是更新的查询:

SELECT TAB1.[CDNO]
   , TAB1.[IDTNO]
   , IIF(ISNULL([TAB1.ECONIV3]), [TAB1.ECONIV2], 'none')  AS [CONTRIB] 
   , IIF(ISNULL([TAB2.ENTCOM3]), [TAB1.ENTCOM2],'none')  AS [CONCOM] 
   , IIF(ISNULL([TAB2.ENTSTI3]), [TAB1.ENTSTI2],'none')  AS [CONSTI] 
 FROM
  TAB1
  LEFT OUTER JOIN TAB2  
  ON (TAB1.[IDTNO] = TAB2.[PTDINO]) AND (IIF(ISNULL([TAB1.ECONIV3]), [TAB1.ECONIV2], 'none')  = IIF(ISNULL([TAB2.ENTSTI3]), [TAB1.ENTSTI2],'none'))
  WHERE ( TAB1.[UNNN] <> "WATER" AND TAB1.[CCCCPP] <> "SALT") 

根据您的描述,我的第一个猜测是将外部联接转换为内部联接,但是您根本不在where子句中引用外部表。我不认为在上面的例子中没有包含where子句或group by语句吗?