2008-10-31 62 views
0

我有兩個表TAB_A和TAB_B。 TAB_A是主表,TAB_B是子/事務表。 TAB_A具有COL_A(主鍵),而TAB_B具有COL_B(主鍵)以及COL_A。DB2查詢輸出 - 不同行爲

由於某些商業原因,COL_A列上的TAB_A和TAB_B之間未定義外鍵。

在TAB_B中有四條記錄,COL_A中有一些值表示1,2,3和4,它們在TAB_A的COL_A中沒有對應的匹配值。 (他們是孤立記錄,錯誤地創建)

當我發出以下SELECT查詢,我得到四個記錄

SELECT B.COL_B, 
     B.COL_A 
    FROM TAB_A A, 
     TAB_B B 
WHERE A.COL_A = B.COL_A 
    AND B.COL_A IN (1, 2, 3, 4) 

但是,如果我開始在SELECT查詢指A.COL_A,沒有記錄返回。

SELECT B.COL_B, 
     B.COL_A, 
     A.COL_A 
    FROM TAB_A A, 
     TAB_B B 
WHERE A.COL_A = B.COL_A 
    AND B.COL_A IN (1, 2, 3, 4) 

有人能解釋這種奇怪的行爲嗎?

DB2版本9.5在AIX

+0

請確認第一個查詢與描述完全相同,並確實返回4條記錄。它不應該返回任何東西,如果COL_A的值1,2,3,4不存在於TAB_B中。 – 2008-10-31 08:40:01

+0

顯然在第二個查詢中存在拼寫錯誤,也許您在說A.COL_A = B.COL_C或其他一些錯字 – Hogan 2013-11-18 16:01:59

回答

0

你應該在你的內部聯接使用ON子句而不是WHERE子句。 ON子句涉及到實際的連接,而WHERE通常用於與連接無關的額外條件。

IBM says: 「連接條件在ON關鍵字之後指定,並確定如何將兩個表彼此進行比較以生成連接結果[...]任何與實際不相關的附加條件連接在WHERE子句中指定,或作爲ON子句中實際連接的一部分指定。「

在您的示例中,您似乎正在做相反的事,在WHERE子句中使用連接條件。 AFAIK,這不是非法的,但它可以解釋這種奇怪的行爲,當與只引用其中一個表的列的SELECT子句一起使用時。

0

我查看了IBM站點中的文檔。儘管他們談論使用「JOIN」,但也提到了使用「WHERE」條件(我使用)的直接連接,並提到它們應該產生相同的結果。

此外,我以前在Oracle和SQL Server工作。上面的語法工作正常。仍然不確定爲什麼輸出不同,只是因爲在SELECT子句中添加了額外的列

+0

您有一個錯字,並且這不是您添加到您的問題的正確位置,成爲問題的一部分。 – Hogan 2013-11-18 16:01:13

1

這兩個查詢都應該返回相同的行。如果這確實如您所描述的那樣工作,那麼您在DB2中發現了一個錯誤。

你想用這個查詢來完成什麼?如果B.COL_A的值(1,2,3,4)是孤立記錄,則此查詢不應返回任何行。如果你打算尋找孤兒,你可能需要做某種外連接。

0

你的第二個SQL實際上是一個「INNER JOIN」。

由於表B行1,2,3,4是孤兒,所以條件A.COL_A = B.COL_A永遠不會成立。

您需要編寫一個明確的「LEFT OUTER JOIN」來獲取行,但A.COL_A總是返回NULL。