为什么相关子查询结果不能用于外部查询?

时间:2015-01-30 07:05:07

标签: sql oracle correlated-subquery

为什么相关子查询结果不能用于外部查询?

在下面的查询中,我想访问外部查询中内部corrleated查询中的计数。但它给出了错误。

我做错了什么?

referenct - http://sqlzoo.net/wiki/More_JOIN_operations#Looking_at_the_id_field

问题14(根据至少有30个主演角色的演员的字母顺序获取一个列表。)

select distinct a.name  , t.count
from actor a 
join casting c 
on (a.id= c.actorid) 
where 25< (select count(movieid) as count 
    from casting c1 
    where c1.actorid= a.id) as t
order by a.name

以下查询工作正常。

select distinct a.name, (select count(movieid) as count 
    from casting c1 
    where c1.actorid= a.id)
from   actor a 
join casting c 
on (a.id= c.actorid) 

http://sqlfiddle.com/#!4/4e7be/8

4 个答案:

答案 0 :(得分:3)

count是子查询中的一列,但它不是外连接的一部分。因此,它在子查询本身之外是不可见的。

解决这个问题的一个更简单的方法是通过计算连接本身的计数,如下所示:

select a.name, count(movieid)
from
actor a 
join casting c
on a.id = c.actorid
group by a.name, a.id
having count(movieid) > 3
order by a.name;

SQL Fiddle

答案 1 :(得分:1)

问题是要问两件事。一个主演角色,两个至少30次。您可以使用WHERE解决第一个问题,然后将结果分组计数。最后使用HAVING来过滤第二个问题。

您可以在HAVING语句中使用COUNT函数。

SELECT actor.name
 FROM actor JOIN casting ON actor.id = casting.actorid
 WHERE ord = 1
 GROUP BY actor.name
 HAVING COUNT(actor.name) >= 30
 ORDER BY actor.name 

答案 2 :(得分:0)

SELECT名称FROM在actor.id = casting.actorid上投射JOIN演员 WHERE ord = 1 GROUP BY名称 HAVING COUNT(movieid)&gt; = 30

答案 3 :(得分:0)

选择名称 从演员 JOIN cast on(id = actorid AND(SELECT COUNT(ord)from cast) 在哪里actorid = actor.id AND ord = 1)> = 30) GROUP BY名称