2011-11-26 34 views
1

我有一個有點問題,這裏使用表格下面的語句:使用加入解析出重複數據

[Users] Name,Email,Subscribed 
[Email] Name,Email,Subscribed 

需要基本上就是要完成全部處於Users表需要的訂閱用戶請與Email表中的用戶進行覈對,以查看它們是否存在於表中,並且僅返回Users表中在電子郵件表中找不到的用戶。

這是我用過的語句,但它返回了數百萬行,並且一直持續下去,並且它返回Email表中的每個電子郵件地址,我不認爲這是解決此問題的最佳方法,因爲它不會返回準確的數據。有什麼想法嗎?

SELECT Distinct c.Name,c.Email from Users c 
INNER JOIN Email e on c.Email <> e.Email 
WHERE c.Subscribed=1 
+1

這是你的問題中第一個應該是「ON」的嗎?我甚至不認爲這個查詢會被編譯。 – JohnFx

回答

0

我想這就是你要找的。

SELECT c.Name,c.Email 
    FROM Users c LEFT JOIN Email e ON (c.email=e.email) 
    WHERE (e.email is null) and (c.subscribed=1) 

INNER JOIN在你的查詢中沒有ON子句是爲什麼你會得到古怪的結果。

0

變化<>爲=

你正在做非平等的加盟,使這就是爲什麼你的結果大小爆炸。

在旁註中 - 檢查外鍵向前 - 他們使這種類型的交叉表參照完整性不成問題。

更新 - 如果你想要的結果在一個表中沒有的其他事:

select * from table1 where email not in (select distinct email from table2); 

這會給你在表1中的所有記錄不表匹配的電子郵件2.

HTH

+0

如果我這樣做=而不是返回兩個表中存在的用戶,而不是返回電子郵件表中找不到用戶的差異。 –

+0

看到我的編輯一瞬間上面.. – Ross

+1

實際上,OP甚至沒有在連接表達式中的標準,所以它不是在平等或非平等的連接。整個方法是有缺陷的。需要重寫爲外連接,如我的答案中所示。 – JohnFx

0

您將要使用LEFT JOIN來實現:

SELECT Distinct u.Name, u.Email 
FROM Users AS u 
LEFT JOIN Email AS e ON u.Email = e.Email 
WHERE e.Email IS NULL 
    AND u.Subscribed = 1 

JOINS圖形說明可能是有用

我強烈建議使用Foreign Keys爲了保持參照完整性。