2015-06-25 54 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

相關問題