2012-09-17 57 views
1

我想從一個表SQL在VS路口

USER HOBBY 
John Sport 
Ann Piano 
Lee Reading 
Ann Sport 
Lee Piano 

選擇的結果和我想尋找誰擁有超過一個共同愛好的人。其中查詢具有更好的性能,

select user from table where hobby = "sport" 
intersect 
select user from table where hobby = "piano" 

或者

select user from table where user in (select user from table where hobby = "piano") and where hobby = "sport"? 
+3

MySQL和Oracle標籤都是?這是什麼?兩者都有不同的優化者,並會制定不同的計劃。你會在一個可以運行高度平行計劃的多處理器系統上,或者一個單處理器單核心機器上,它必須按順序執行所有的事情嗎?即使如此,你是否真的在樣本數據上嘗試過它們,以反映你的真實世界環境? – MatBailie

+0

MySQL甚至不支持'交集' –

+0

+ 1到陽瑞....優化是非常具體的數據大小,基數,硬件,軟件等。談到它一般通常是一個浪費時間。基準他們兩個,你會知道答案。 –

回答

0

在Oracle的執行時間,假設(USER, HOBBY)是唯一之三的解決方案,你可以使用一個GROUP BY查詢:

SELECT user 
    FROM user_hobby 
WHERE hobby IN ('piano', 'sport') 
GROUP BY user 
HAVING COUNT(*) = 2 

這將使甲骨文最多單次執行數據,而INTERSECT將單獨處理每個查詢,因此需要兩次通過。

+0

這會告訴你只有擁有兩個相同愛好的用戶,而不是擁有「多於一個」共同愛好的用戶;) –

+0

這是相交查詢的等價物。儘管我可能誤解了OP的要求:) –