相关子查询和联接

时间:2012-09-25 21:00:48

标签: sql sql-server join

任何人都可以告诉我在JOIN上使用相关子查询之间的区别吗?它们不是要解决同样的问题。是否有一个表现命中。我正在使用SQL服务器,我倾向于使用FOR XML PATH('')来选择子查询中出现的多个列。任何解释差异的例子都将受到赞赏。

2 个答案:

答案 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。