SQL相关子查询的唯一构造等价物

时间:2017-10-13 08:50:47

标签: sql oracle correlated-subquery

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年最多提供一次的所有课程 但是,如果我们比较 &#34; 1&lt; =(子查询)&#34; 中的子查询结果,则子查询的结果可能包含重复的元组......所以,即使1&lt; = 2。

,where子句的结果也可能被评估为真

3 个答案:

答案 0 :(得分:0)

我相信您的查询等同于以下

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。优化器通常比子查询好得多。

答案 1 :(得分:0)

  

此查询应该可以找到2009年最多提供一次的所有课程。

您需要从

交换条件
1 <= (SELECT COUNT(r.course_id) ...

(在2009年找到一次或多次提供的课程)

1 >= (SELECT COUNT(r.course_id) ...

(2009年发现的课程为零或一次)

答案 2 :(得分:-1)

您的子查询只返回一个值,即2009年相关课程的部分计数。所以查询没有问题(除了它正在寻找至少一次的课程,你说你想要找一次最多的课程)。