2012-06-06 31 views
-1

今天我遇到了一個稱爲相關查詢和非相關查詢的sql服務器功能。根據我的理解,上述提到的概念所做的任務可以使用連接來實現。核心和非核查查詢的需求是什麼?

所以根據我的理解,在提出這個概念之前,sql server的體系結構可能有一些預定義的目標。我想知道它。

回答

1

在許多情況下,相關的子查詢可以重寫爲查詢。您還應該瞭解SQL Server未發明任何這些創意 - SQL,相關子查詢或非相關子查詢。我很確定這些回到了IBM在20世紀70年代後期指定的原始SQL語言。他們肯定是在1992年的第一個SQL標準。

我可以想到三種情況下,你需要相關的子查詢或他們是可取的。

首先,在嘗試匹配兩個表之間的行時使用update或delete。在這種情況下,該語法似乎需要相關的子查詢,否則會進行聯接。實際上,SQL Server確實提供瞭解決這個問題的語法,但最終卻引入了更復雜的想法 - 例如,更新連接中的一個表意味着什麼。

其次,當相關子查詢使用某些窗口函數,如row_number()。在這種情況下,可能無法展開它們。

第三種情況是效率之一。考慮下面的查詢:

select * 
from a 
where a.blah in (select blah from b where b.foo = a.foo) and a.id in (list) 

您可以展開此爲:

select a.* 
from a join 
    (select distinct b.foo, b.blah 
     from b 
    ) b 
    on a.foo = b.foo and 
     a.blah = b.blah 
where a.id in (list) 

在第一種情況下,如果是在B foo和嗒嗒的索引,那麼優化器可能會使用索引而不是做任何聚合。在第二種情況下,即使只有一行可以使用,幾乎所有的優化器(我知道)都會在子查詢上進行聚合。