【问题标题】:Is this correlated subquery or non-correlated subquery?这是相关子查询还是非相关子查询?
【发布时间】:2020-03-28 15:42:33
【问题描述】:

我目前正在阅读 Abraham SilberschatzHenry F. KorthS 的“数据库系统概念”。苏达山

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

它们显示以下查询:

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

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

但是他们对上面的SQL代码sn-p提供了如下解释:

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

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

我不明白!

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

【问题讨论】:

    标签: sql


    【解决方案1】:

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

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

    【讨论】:

    • 很好的解释
    猜你喜欢
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 2021-03-24
    • 2015-11-11
    相关资源
    最近更新 更多