嵌套查询或连接

时间:2010-10-09 16:57:37

标签: sql sql-server tsql join

我听说过联接应该比嵌套查询更受欢迎。一般来说是真的吗?或者可能存在一个比其他更快的情况:

例如哪种写入查询更有效?:

Select emp.salary 
from employee emp    
where emp.id = (select s.id from sap s where s.id = 111)

OR

Select emp.salary     
from employee emp   
INNER JOIN sap s ON emp.id = s.id   
WHERE s.id = 111

3 个答案:

答案 0 :(得分:9)

  

我听说过联接应该比嵌套查询更受欢迎。一般来说这是真的吗?

这取决于要求和数据。

如果有多个与其相关的子记录,则使用JOIN可能会复制父表的结果集中的信息,因为JOIN会返回匹配的行。这意味着如果您在使用JOIN时需要父表中的唯一值,则需要查看使用DISTINCTGROUP BY子句。但如果使用子查询,这一点都不是问题。

此外,子查询并不完全相同。有一个直接的评估,就像你的例子:

where emp.id = (select s.id from sap s where s.id = 111)

...和IN子句:

where emp.id IN (select s.id from sap s where s.id = 111)

...如果s.id返回多个值,则直接评估将引发错误时,将匹配子查询返回的任何值。但是还有EXISTS条款......

WHERE EXISTS(SELECT NULL 
               FROM SAP s
              WHERE emp.id = s.id
                AND s.id = 111)

EXISTS的不同之处在于:

  • 不会评估SELECT子句 - 您可以将其更改为SELECT 1/0应该触发被零除错误但不会
  • 它返回true / false;如果满足标准,则基于第一个实例为true,因此在处理重复项时更快。
  • 与IN子句不同,EXISTS支持同时比较两个或多个列比较,但有些数据库确实支持与IN的元组比较。
  • 它更具可读性

答案 1 :(得分:1)

如果查询在逻辑上是等效的,那么查询优化器应该能够从每个查询生成相同(最佳)的执行计划。在这种情况下,查询样式应该支持最好的理解(这是我的子查询)。

答案 2 :(得分:0)

在索引上连接两个表比运行两个单独的查询(甚至是子查询)要快得多(并且更容易编写)。