SQL 相关子查询唯一构造等效
SQL correlated subquery unique construct equivalent
select T.course_id from course T
where 1 <=
( select count(R.course_id) from section R
where R.course_id = T.course_id
and R.year = 2009 );
此查询应该查找在 2009 年最多开设一次的所有课程。
但是,如果我们比较子查询的结果,如 "1 <= (subquery)",子查询的结果可能包含重复的元组。 ..因此,即使 1<=2.
,where 子句的结果也可能为真
我相信你的查询相当于下面的
select T.course_id
from course as T
left join section as R where T.course_id = R.course_id and R.year = 2009
group by T.course_id
having count(R.course_id) <= 1
尽可能使用group by
和having
。对于优化器来说,Is 通常比子查询好得多。
您的子查询只有 returns 一个值,即相关课程在 2009 年的节数。所以查询没有问题(除了它正在寻找至少参加过一次的课程,你说你想寻找最多参加过一次的课程)。
This query is supposed to find all courses which are offered at most once in the year 2009.
您需要从
交换条件
1 <= (SELECT COUNT(r.course_id) ...
(查找2009年开过一次或多次的课程)
至
1 >= (SELECT COUNT(r.course_id) ...
(查找 2009 年开设零次或一次的课程)
select T.course_id from course T
where 1 <=
( select count(R.course_id) from section R
where R.course_id = T.course_id
and R.year = 2009 );
此查询应该查找在 2009 年最多开设一次的所有课程。
但是,如果我们比较子查询的结果,如 "1 <= (subquery)",子查询的结果可能包含重复的元组。 ..因此,即使 1<=2.
我相信你的查询相当于下面的
select T.course_id
from course as T
left join section as R where T.course_id = R.course_id and R.year = 2009
group by T.course_id
having count(R.course_id) <= 1
尽可能使用group by
和having
。对于优化器来说,Is 通常比子查询好得多。
您的子查询只有 returns 一个值,即相关课程在 2009 年的节数。所以查询没有问题(除了它正在寻找至少参加过一次的课程,你说你想寻找最多参加过一次的课程)。
This query is supposed to find all courses which are offered at most once in the year 2009.
您需要从
交换条件1 <= (SELECT COUNT(r.course_id) ...
(查找2009年开过一次或多次的课程)
至
1 >= (SELECT COUNT(r.course_id) ...
(查找 2009 年开设零次或一次的课程)