今天我遇到了一個稱爲相關查詢和非相關查詢的sql服務器功能。根據我的理解,上述提到的概念所做的任務可以使用連接來實現。核心和非核查查詢的需求是什麼?
所以根據我的理解,在提出這個概念之前,sql server的體系結構可能有一些預定義的目標。我想知道它。
今天我遇到了一個稱爲相關查詢和非相關查詢的sql服務器功能。根據我的理解,上述提到的概念所做的任務可以使用連接來實現。核心和非核查查詢的需求是什麼?
所以根據我的理解,在提出這個概念之前,sql server的體系結構可能有一些預定義的目標。我想知道它。
在許多情況下,相關的子查詢可以重寫爲查詢。您還應該瞭解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和嗒嗒的索引,那麼優化器可能會使用索引而不是做任何聚合。在第二種情況下,即使只有一行可以使用,幾乎所有的優化器(我知道)都會在子查詢上進行聚合。