[英]Is this correlated subquery or non-correlated subquery?
我目前正在阅读Abraham Silberschatz 、 Henry F. Korth和S. Sudarshan撰写的“数据库系统概念”。
其中有一个删除的例子,就是删除所有工资低于大学平均水平的教师的记录。
它们显示以下查询:
delete from instructor
where salary < (select avg(salary)
from instructor);
我认为内部选择查询是不相关的子查询! 意味着它应该只执行一次,然后外部选择查询。
但他们为上述 SQL 代码片段提供了以下解释:
delete语句首先测试关系讲师中的每个元组,以检查薪水是否低于大学讲师的平均薪水。 然后,所有未通过测试的元组(即代表工资低于平均工资的教师)都将被删除。 在执行任何删除之前执行所有测试很重要——如果在测试其他元组之前删除了一些元组,平均工资可能会发生变化,删除的最终结果将取决于处理元组的顺序!
上面的文字表明内部选择查询是一个相关的子查询! 意味着它对每一行外部关系执行内部子查询。
我不明白!
任何人都可以告诉我,这是不相关的还是相关的子查询? 为什么?
在您当前的查询中,出现在WHERE
子句中的子查询是不相关的:
DELETE
FROM instructor
WHERE salary < (SELECT AVG(salary) FROM instructor);
SQL Server 优化器应评估平均子查询一次,并缓存该结果以用于删除查询。
然而,考虑以下版本子查询是相关的:
DELETE
FROM instructor i1
WHERE i1.salary < (SELECT AVG(i2.salary) FROM instructor i2
WHERE i2.department = i1.department);
这将删除所有工资恰好低于每个部门平均水平的教师。 在这种情况下,子查询依赖于涉及外部删除的表,因此该子查询是相关的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.