2013-05-03 48 views
1

我有表A和表B.我知道表B有7848行(計數(*)),我想看看哪些7848存在於表A內。至於我知道INNER JOIN返回出現在兩個表A和B.所以我內心加入了他們這樣的價值觀:差異獲取值不在內部加入差異

SELECT * 
FROM 
    TABLE1 AS A 
INNER JOIN 
    TABLE2 AS B 
ON A.field1 = B.field1 

該查詢返回1902行。現在,我要找出哪些行沒有出現在表B中,所以我這樣做:

SELECT * FROM TABLE_B WHERE FIELD1 NOT IN (field1*1902....); 

通過差異我想我應該得到的5946行的結果,因爲我發現1902正行。奇怪的是,這個NOT IN語句返回6175行,如果我添加它們,我得到8077,這比count(*)告訴我表B有多少。

我可能會做錯什麼?

在此先感謝。

回答

2

聯接是一種-的乘法。如果表A中具有相同字段1的多行,則B中的行將被多次計數。

也許你想

SELECT * FROM TABLE_B B 
WHERE EXISTS (SELECT field1 from TABLE_A A WHERE A.field1 = B.field1); 
1

嘗試:

SELECT * 
FROM 
    TABLE1 AS A 
LEFT JOIN 
    TABLE2 AS B 
ON A.field1 = B.field1 
WHERE B.field1 IS NULL 
1

下面的查詢將返回表A中不在B錶行:

SELECT * FROM TABLE1 WHERE field1 NOT IN (SELECT field1 FROM TABLE2) 

您也可以擺脫有更好的表現IN條件的:

SELECT * FROM TABLE1 A WHERE NOT EXISTS (SELECT 1 FROM TABLE2 B WHERE B.field1 = A.field1) 
1

表1中也可能存在Table1中的一些重複值。您的第一個查詢將多次返回這些記錄。

如果您有空值,您還需要小心:INNER JOIN和NOT IN不會返回這些值。