首页 > 解决方案 > 这是相关子查询还是非相关子查询?

问题描述

我目前正在阅读Abraham SilberschatzHenry F. KorthS. Sudarshan撰写的“数据库系统概念” 。

其中有一个删除的例子,就是删除所有工资低于大学平均水平的教师的记录。

他们显示以下查询:

delete from instructor 
where salary < (select avg(salary) 
                from instructor);

我认为内部选择查询是不相关的子查询!意味着它应该只执行一次然后外部选择查询。

但他们为上述 SQL 代码片段提供了以下解释:

删除语句首先测试关系教师中的每个元组,以检查工资是否低于大学教师的平均工资。然后,所有未通过测试的元组(即代表工资低于平均水平的教师)都将被删除。在执行任何删除之前执行所有测试很重要——如果在测试其他元组之前删除了一些元组,平均工资可能会改变,删除的最终结果将取决于处理元组的顺序!

上面的文字表明内部选择查询是一个相关的子查询!意味着它执行内部子查询的每一行外部关系。

我不明白!

谁能告诉我,这是不相关的还是相关的子查询?为什么?

标签: sql

解决方案


在您当前的查询中,出现在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);

这将删除所有工资恰好低于每个部门平均水平的教师。在这种情况下,子查询依赖于外部删除所涉及的表,因此该子查询是相关的。


推荐阅读