2015-06-25 53 views
0

首先查询比预期的查询:JOIN与WHERE子句返回较少的结果在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条件匹配。

回答

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 statement语句吗?

+0

偶数的括号在第二个查询中打开和关闭,所以可能还有别的东西? – Zachs

+0

是的,必须是别的东西,但该查询中没有任何东西可能会导致从右表中排除,无论如何还有第一个查询的额外排除,因为where子句引用右表的查询是相同的。 – Randall

相关问题