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 byhaving。对于优化器来说,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 年开设零次或一次的课程)