我听说过联接应该比嵌套查询更受欢迎。一般来说是真的吗?或者可能存在一个比其他更快的情况:
例如哪种写入查询更有效?:
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
答案 0 :(得分:9)
我听说过联接应该比嵌套查询更受欢迎。一般来说这是真的吗?
这取决于要求和数据。
如果有多个与其相关的子记录,则使用JOIN可能会复制父表的结果集中的信息,因为JOIN会返回匹配的行。这意味着如果您在使用JOIN时需要父表中的唯一值,则需要查看使用DISTINCT
或GROUP 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 1/0
,应该触发被零除错误但不会答案 1 :(得分:1)
如果查询在逻辑上是等效的,那么查询优化器应该能够从每个查询生成相同(最佳)的执行计划。在这种情况下,查询样式应该支持最好的理解(这是我的子查询)。
答案 2 :(得分:0)
在索引上连接两个表比运行两个单独的查询(甚至是子查询)要快得多(并且更容易编写)。