嵌套查询或连接

aja*_*jay 10 sql t-sql sql-server join

我听说连接应该优先于嵌套查询.一般来说是真的吗?或者可能存在一个比其他更快的情况:

例如哪个是更有效的查询方式?:

Select emp.salary 
from employee emp    
where emp.id = (select s.id from sap s where s.id = 111)
Run Code Online (Sandbox Code Playgroud)

要么

Select emp.salary     
from employee emp   
INNER JOIN sap s ON emp.id = s.id   
WHERE s.id = 111
Run Code Online (Sandbox Code Playgroud)

OMG*_*ies 9

我听说连接应该优先于嵌套查询.一般来说是真的吗?

这取决于要求和数据.

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

而且,子查询并不完全相同.有直接的评估,就像你的例子:

where emp.id = (select s.id from sap s where s.id = 111)
Run Code Online (Sandbox Code Playgroud)

......和IN子句:

where emp.id IN (select s.id from sap s where s.id = 111)
Run Code Online (Sandbox Code Playgroud)

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

WHERE EXISTS(SELECT NULL 
               FROM SAP s
              WHERE emp.id = s.id
                AND s.id = 111)
Run Code Online (Sandbox Code Playgroud)

EXISTS的不同之处在于:

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