今天遇到了sql server的一个特性,叫做关联查询和非关联查询。据我了解,上述概念完成的任务可以使用连接来实现。
所以根据我的理解,在提出这个概念之前,sql server 的架构可能有一些预定义的目标。我想知道。
今天遇到了sql server的一个特性,叫做关联查询和非关联查询。据我了解,上述概念完成的任务可以使用连接来实现。
所以根据我的理解,在提出这个概念之前,sql server 的架构可能有一些预定义的目标。我想知道。
在许多情况下,相关子查询可以重写为查询。您还应该了解 SQL Server 并没有发明任何这些想法——SQL、相关子查询或非相关子查询。我很确定这些可以追溯到 IBM 在 1970 年代后期指定的原始 SQL 语言。它们绝对是 1992 年的第一个 SQL 标准。
我可以想到三种需要相关子查询或需要相关子查询的情况。
首先,在尝试匹配两个表之间的行时使用更新或删除。在这种情况下,语法似乎需要相关的子查询来进行连接。实际上,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 和 blah 上有索引,那么优化器可能会使用该索引而不进行任何聚合。在第二种情况下,几乎所有优化器(据我所知)都会对子查询进行聚合,即使只使用一行也是如此。