此查询是否包含相关或非相关子查询?
Does this query include a correlated or non correlated subquery?
所以我编写了一个简单的查询,它为我提供了在 property_usage table 中只出现一次的属性的 ID #,以及它们相关使用类型的代码。因为我不想包含一个列来显示每个 属性 ID 在 property_usage table 中出现的次数,所以我写了两个子查询来获取所有的列表属性 只出现一次的 ID。然后,我使用这些子查询的结果(属性ID 的单列)过滤掉那些在 table 中多次出现的属性。
这里是查询:
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 列似乎不是传递到最内层查询的值。看起来最内层的查询在技术上可能是派生的 table,在这种情况下,我的代码很草率,因为我没有在该 SELECT 语句的 FROM 子句中为 table 名称添加别名。
In a SQL database query, a correlated subquery (also known as a synchronized subquery) is a subquery (a query nested inside another query) that uses values from the outer query.
(Wikipedia,强调我的。)
你的没有,所以它不是相关子查询。基本上,如果你能把子查询切掉,运行它作为一个独立的查询,没有外部上下文,它肯定是不相关的。它可以在你的情况下完成。
顺便说一句,您可以使用 not exists
子句重写它以检查是否存在具有相同 PK 但另一个 property_id
的另一条记录,并获得比使用 count()
更好的查询计划.不过,这是我的猜测;只有 explain plan
会显示是否有好处。
所以我编写了一个简单的查询,它为我提供了在 property_usage table 中只出现一次的属性的 ID #,以及它们相关使用类型的代码。因为我不想包含一个列来显示每个 属性 ID 在 property_usage table 中出现的次数,所以我写了两个子查询来获取所有的列表属性 只出现一次的 ID。然后,我使用这些子查询的结果(属性ID 的单列)过滤掉那些在 table 中多次出现的属性。
这里是查询:
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 列似乎不是传递到最内层查询的值。看起来最内层的查询在技术上可能是派生的 table,在这种情况下,我的代码很草率,因为我没有在该 SELECT 语句的 FROM 子句中为 table 名称添加别名。
In a SQL database query, a correlated subquery (also known as a synchronized subquery) is a subquery (a query nested inside another query) that uses values from the outer query.
(Wikipedia,强调我的。)
你的没有,所以它不是相关子查询。基本上,如果你能把子查询切掉,运行它作为一个独立的查询,没有外部上下文,它肯定是不相关的。它可以在你的情况下完成。
顺便说一句,您可以使用 not exists
子句重写它以检查是否存在具有相同 PK 但另一个 property_id
的另一条记录,并获得比使用 count()
更好的查询计划.不过,这是我的猜测;只有 explain plan
会显示是否有好处。