cpu
发生错误:ORA-00907:缺少右括号。无法执行查询 有人可以帮我找出错误。
答案 0 :(得分:1)
唉,Oracle不允许as
获取表别名:
select s.mname,count(distinct s.actorlist) as act
from p s
group by s.mname
having count(distinct s.actorlist) =
(select max(t.act)
from (select s1.mname, count(distinct s1.actorlist) as act
from p s1
group by s1.mname
) t
);
请注意:我建议使用窗口函数来实现此目的,而不是嵌套的子查询。
这看起来像是:
select s.*
from (select s.mname, count(distinct s.actorlist) as act,
max(count(distinct s.actorlist)) over () as max_act
from p s
group by s.mname
) s
where act = max_act;
答案 1 :(得分:0)
子查询方法可以简化如下:
select mname, count(distinct actorlist) as act
from p
group by mname
having count(distinct actorlist) = ( select max( count(distinct actorlist) )
from p
group by mname
);
注意子查询(在HAVING条件下)如何工作:它按p
对表mname
中的行进行分组,然后在每个组中计算不同的actorlist
,然后需要所有组的MAX(超过所有mname
)。
我没有看到在这里使用别名的好处,无论是表还是列。我也认为将名为p
的表别名与s
混淆是没有意义的 - 即使您需要完全限定列名,p.actorlist
也完全没问题。通过不使用别名,您可以向未来的开发人员明确说明子查询是自包含的(它与外部查询中的任何内容都不相关 - 它只是以自包含的方式计算数字,并返回该数字到HAVING条款)。
在这种情况下,我不相信需要分析功能。 (当然,GROUP BY解决方案不再具有不同级别的嵌套子查询,因此不再考虑分析函数的原因。)
您可以使用dense_rank last
避免两次读取基表,但我只会考虑性能差;否则这个解决方案看起来很干净,很容易向任何人解释并维护。