此查询是否包含相关或非相关子查询?

时间:2017-05-12 14:54:11

标签: sql oracle-sqldeveloper

所以我写了一个简单的查询,它给了我在property_usage表中只显示一次的属性的ID#,以及它们相关用法类型的代码。由于我不想包含显示每个属性ID在property_usage表中显示的次数的列,因此我编写了两个子查询来获取仅显示一次的所有属性ID的列表。然后,我使用这些子查询的结果(一列propertyIDs)来过滤掉在表中出现多次的属性。

这是查询:

select pu.property_id, pu.usage_type_id 
from acres_final_40.property_usage pu
where pu.property_id not in 
  (select multiple_use_properties 
  from 
    (select pu.property_id multiple_use_properties, count(pu.property_id) 
    from acres_final_40.property_usage pu
    group by pu.property_id having count(pu.property_id) > 1))
order by pu.property_id;

我的问题是:最内层的子查询是否与最外层的查询相关或不相关?

我有以下想法(见下段),但我想知道我是否对此有所了解。我自己学习所有这些东西,没有任何人可以亲自询问这个问题!

我的感觉是,它不是,因为看起来最外层查询的pu.propertyID列不是传递到最里面查询的值。看起来最里面的查询在技术上可能是一个派生表,在这种情况下我的代码是草率的,因为我没有在该SELECT语句的FROM子句中为表名设置别名。

1 个答案:

答案 0 :(得分:0)

  

在SQL数据库查询中,相关子查询(也称为同步子查询)是一个子查询(嵌套在另一个查询中的查询),使用外部查询中的值

Wikipedia,我的。)

你的不是,所以它不是相关的子查询。基本上,如果你可以删除子查询并将其作为一个独立的查询运行,没有外部上下文,它肯定是不相关的。它可以在你的情况下完成。

顺便说一句,您可以使用not exists子句重写它,以检查是否存在具有相同PK但另一个property_id的另一条记录,并获得比使用count()更好的查询计划。不过,这是我的推测;只有explain plan会显示是否有好处。

相关问题