首先查询:
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 :(得分: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语句吗?