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