繁体   English   中英

这是相关子查询还是非相关子查询?

[英]Is this correlated subquery or non-correlated subquery?

我目前正在阅读Abraham SilberschatzHenry F. KorthS. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM