exist-in和關聯子查詢-非關聯子查詢

ylfxml發表於2011-11-09
對於exist和in,大家的一致看法如下:
1.in是子查詢為驅動表,外面的表為被驅動表,故適用於子查詢結果集小而
外面的表結果集大的情況。
2.exists是外面的表位驅動表,子查詢裡面的表為被驅動表,故適用於外面
的表結果集小而子查詢結果集大的情況。
而為何會出現這種和in的使用上的區別呢,其實問題的關鍵在於關聯
子查詢和非關聯子查詢上。exists一般都是關聯子查詢,in則一般都是非關聯
子查詢。
對於關聯子查詢,必須先執行外層查詢,接著對所有透過過濾條件的記錄,執行
內層查詢。外層查詢和內層查詢相互依賴,因為外層查詢會把資料傳遞給內層查詢。
非關聯子查詢則必須先完成內層查詢之後,外層查詢才能介入。
exsits:
select whatever from table_a a
where exists(
select null from table_b b
where b.id=a.id
and somecondition
)
and somecondition
可以看到,在exists子查詢裡面,有關鍵的一個連線條件:where b.id=a.id,就是這個條件決定了必須先找出a中符合條件的記錄,然後才能與b連線,最終得出查詢的結果。這就是為什麼說exists適用於外面的表結果集小而子查詢結果集大的情況。因為必須先執行外層查詢,然後才能執行內層查詢。
而in則恰恰相反,不再詳述。[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7548/viewspace-1056232/,如需轉載,請註明出處,否則將追究法律責任。

相關文章