2012-09-25 91 views
0

請任何人都可以給我使用相關的子查詢通過JOIN的區別?他們是不是要解決同樣的問題。有沒有比一個更好的表現。我正在使用SQL Server,我傾向於使用FOR XML PATH('')來選擇子查詢中出現的多個列。任何解釋差異的例子將不勝感激。Correlated Subquery and Joins

+0

您是否查看過連接和相關子查詢的執行計劃? – Taryn

+0

我聽說過執行計劃這個詞,但我真的不知道這個詞。請你解釋一下。 – damola

+4

在這種情況下,粗略的谷歌搜索會給你http://msdn.microsoft.com/en-us/library/ms178071(v=sql.105).aspx這是權威領域之一(因爲微軟編寫的SQL服務器,ergo執行計劃)......基本上,它是如何知道查詢在運行查詢時所做的事情。 – jcolebrand

回答

1

「請任何人都可以給我使用關聯子查詢加入JOIN的區別?他們是不是要解決同一個問題?」

不,他們不是。

使用相關的子查詢,您將得到一個表達式,用於調用SEMIJOIN或關係代數的SEMIMINUS。 (請注意,我說的是這裏最典型的使用相關子查詢的。)

SELECT * FROM A1 
WHERE attr in (SELECT attr FROM A2); 

只給你出現在A1的列。不同於如果你寫的JOIN

SELECT * FROM A1 NATURAL JOIN A2 

這也將讓你從不會出現在A1 A2任何其他列,你會得到什麼。

而且

SELECT * FROM A1 
WHERE attr NOT IN (...) 

還涉及相關子查詢,但是這一次卻是,甚至不能寫成加入semiminus調用。

最後,相關的子查詢也可以出現在SELECT列表中。

SELECT a,b, (SELECT MIN(b) FROM T AS sub WHERE sub.a=main.a AND sub.b>main.b) 
    FROM T AS main 

在這種情況下,許多這種性質的查詢也不能寫成JOIN。

2

像往常一樣,它是馬匹的課程。

但是,有一個鬆散的規則,如果您可以使用JOIN執行此操作,那麼它會更好,因爲您可以使用SQL Server的基於集合的操作將兩個數據流匹配在一起。

然而,相關的子查詢是解決某些問題的唯一方法,但它們會導致類似循環的行爲,每行一個 - 必然會更慢並且性能更差。