任何人都可以告诉我在JOIN上使用相关子查询之间的区别吗?它们不是要解决同样的问题。是否有一个表现命中。我正在使用SQL服务器,我倾向于使用FOR XML PATH('')来选择子查询中出现的多个列。任何解释差异的例子都将受到赞赏。
答案 0 :(得分:2)
但是,如果你可以使用JOIN来实现它,那么它会更好,因为你可以使用SQL Server的基于集合的操作将两个数据流匹配在一起。
然而,相关子查询是解决某些问题的唯一方法,但它们会导致类似循环的行为,每行一行 - 必然更慢并且性能更差。
答案 1 :(得分:1)
“请问任何人都可以告诉我在JOIN上使用相关子查询之间的区别吗?他们不是要解决同样的问题吗?”
不,他们不是。
使用相关子查询,您可以获得一个表达式,用于调用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 (...)
还涉及一个相关的子查询,但这次它是一个semiminus调用,甚至不能写为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。