【问题标题】:Why correlated subquery result cannot be used in outer query?为什么关联的子查询结果不能用于外部查询?
【发布时间】:2015-01-30 07:05:06
【问题描述】:

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

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

我做错了什么?

参考 - 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

【问题讨论】:

  • 你知道你可以在没有子查询的情况下做到这一点,对吧?另外,你得到什么错误?我无法在此处重现该问题:sqlfiddle.com/#!4/4e7be/1
  • @shree.pat18 更新了查询。
  • WHERE 子句中引用的子查询,在外部 SELECT 处失去作用域

标签: sql oracle correlated-subquery


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    问题是问两件事。一个用于主演,两个至少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 
    

    【讨论】:

      【解决方案3】:

      SELECTname FROM cast JOIN actor.id=casting.actorid WHERE ord=1 GROUP BY 名称 HAVING COUNT(movieid)>=30

      【讨论】:

      • 请解释为什么以及如何解决这个问题,不要只是发布代码。另外,请正确格式化。
      【解决方案4】:

      选择名称 来自演员 JOIN cast ON (id = actorid AND (SELECT COUNT(ord) FROM cast 其中actorid = actor.id AND ord=1)>=30) 按名称分组

      【讨论】:

        【解决方案5】:

        对我来说这很好用:

        select actor.name
        from actor
        join casting on casting.actorid=actor.id
        join movie on casting.movieid=movie.id
        where casting.ord=1
        group by actor.name
        having count(actor.name) > 29
        order by actor.name
        

        【讨论】:

        • 一个好的答案将始终包括解释为什么这会解决问题,以便 OP 和任何未来的读者可以从中学习。
        猜你喜欢
        • 1970-01-01
        • 2023-03-24
        • 2022-08-18
        • 1970-01-01
        • 1970-01-01
        • 2015-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多