2012-10-31 13 views
0

嵌套SQL我有一個SQL,看起來像這樣:MySQL的:使用

SELECT * FROM foo WHERE foo.bar IN (SELECT foobar.bar FROM foobar) 

這是不好的,對不對?嵌套的SELECT會導致事情變慢?我應該如何查詢這樣的內容?

+1

雖然嵌套SQL不相關。您可以查看LEFT JOIN並過濾右欄的NULL記錄。 –

回答

4

IN子句是完全有效的SQL,但並不總是首選的方法。我經常發現MySQL的性能很差,即使foo.bar被索引。

如果將其更改爲連接,那麼如果第二個表的多個行與第一個表的每行的連接條件相匹配,則必須小心,因爲連接將生成多個結果行。如果這是可能的,連接應該是:

SELECT f.* 
FROM foo f 
INNER JOIN (SELECT DISTINCT bar FROM foobar) fb USING (bar); 

最終的答案是,你應該使用EXPLAIN來看看不同形式的查詢將被執行。但是,如果您一開始沒有遇到性能問題,請不要冒汗。

如果你希望所有的地方f.barfoobar存在行,NOT IN通常是把它寫的最簡潔的方式。但它也可以使用LEFT OUTER JOIN這樣寫:

SELECT f.* 
FROM foo f 
LEFT OUTER JOIN foobar fb USING (bar) 
WHERE fb.bar IS NULL 

你不需要在這種情況下,子查詢,因爲你只報告不匹配行,所以顯然不能在多場比賽結果。

+0

我可能會將它切換到'SELECT DISTINCT f。* FROM foo f JOIN foobar fb USING(bar)'使它更容易閱讀。這種方式沒有嵌套查詢。 –

+0

偉大的一點。我只是在考慮它的一面。 –

+0

如果我想'foo'中的所有記錄'foo.bar'在'foobar.bar'中不存在? – StackOverflowNewbie

0

您也可以重寫此爲

Select 
    * 
From 
    foo f 
Where 
    Exists (-- If you want the opposite, put Not in front here 
    Select 'x' 
    From foobar fb 
    Where f.bar = fb.bar 
); 

多年來,不同的DBMS已經在不同形式的一個處理的查詢更好,即使他們都是等價的。我嘗試過的大部分功能都可以爲兩者生成相同的計劃。不過我沒有嘗試過使用mysql。