0

请问谁能告诉我在 JOIN 上使用 Correlated 子查询之间的区别?他们不是为了解决同样的问题。是否有性能击中一个。我正在使用 SQL 服务器,我倾向于使用 FOR XML PATH('') 来选择出现在子查询中的多个列。任何解释差异的示例将不胜感激。

4

2 回答 2

2

像往常一样,这是马的课程。

但是,有一个松散的规则,如果您可以使用 JOIN 来执行此操作,那么效果会更好,因为您可以使用 SQL Server 的基于集合的操作将两个数据流匹配在一起。

然而,相关子查询是解决某些问题的唯一方法,但它们会导致类似循环的行为,每行一个 - 必然更慢且性能更差。

于 2012-09-25T21:07:36.333 回答
1

“请谁能告诉我在 JOIN 上使用 Correlated 子查询之间的区别?他们不是要解决同样的问题吗?”

不,他们不是。

使用相关子查询,您将获得一个调用 SEMIJOIN 或关系代数的 SEMIMINUS 的表达式。(请注意,我在这里谈论的是相关子查询的最典型用法。)

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

只为您提供出现在 A1 中的列。与编写 JOIN 所得到的不同

SELECT * FROM A1 NATURAL JOIN A2

这还将为您提供 A2 中未出现在 A1 中的任何其他列。

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

还涉及相关子查询,但这次是半减号调用,甚至不能写成 JOIN。

最后,相关子查询也可以出现在 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。

于 2012-09-25T21:42:12.257 回答