2013-07-05 44 views
0

我有以下查詢:MySQL NOT IN語法convertible to JOINs?

select full_name, email, users.uid 
from 
cloudsponge 
inner join 
`users` on users.uid = cloudsponge.importer_uid 
where cloudsponge.email not in (select mail from users) 

它按預期工作,但我不知道,我能最後一行轉換爲連接(而不是一個子查詢)。這將是有幫助的,因爲我可以使用我的框架ORM而不是硬編碼SQL進入應用程序。

謝謝!

回答

4

你可以寫:

SELECT full_name, email, users.uid 
    FROM cloudsponge 
INNER 
    JOIN users 
    ON users.uid = cloudsponge.importer_uid 
    LEFT 
    JOIN users AS users2 
    ON cloudsponge.email = users2.mail 
WHERE users2.mail IS NULL 
+0

FYI:我不能告訴你爲什麼,但我一直在兩個不同的數據庫管理員告訴記者,這是不好的做法。我不知道這是否只是因爲他們不喜歡的風格,或者如果優化不喜歡它,或者某些RDBMS的不工作。但他們告訴我使用'not in'或'not exist'技術。 –

+0

@JoeEnos:就個人而言,我不喜歡的風格:'NOT IN'和'NOT EXISTS'都表達真實意圖,而'左JOIN' +'IS NULL'是表達它作爲加入hackish的方式。但是如果你想知道爲什麼那些DBA反對它,你應該問問他們! – ruakh

+1

@JoeEnos,我已經看到了這兩種解決方案更好的表現,但是這取決於很多事情,像RDBMS優化,數據量正在掃描等最佳測試一個給定的情況下,這兩種解決方案。見我的演講[SQL查詢模式,優化](http://www.slideshare.net/billkarwin/sql-query-patterns-optimized)。 –