所以我写了一个简单的查询,它给了我在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子句中为表名设置别名。
答案 0 :(得分:0)
在SQL数据库查询中,相关子查询(也称为同步子查询)是一个子查询(嵌套在另一个查询中的查询),使用外部查询中的值。
(Wikipedia,我的。)
你的不是,所以它不是相关的子查询。基本上,如果你可以删除子查询并将其作为一个独立的查询运行,没有外部上下文,它肯定是不相关的。它可以在你的情况下完成。
顺便说一句,您可以使用not exists
子句重写它,以检查是否存在具有相同PK但另一个property_id
的另一条记录,并获得比使用count()
更好的查询计划。不过,这是我的推测;只有explain plan
会显示是否有好处。