发生错误:ORA-00907:缺少右括号。无法执行查询

时间:2016-10-16 20:39:33

标签: sql oracle

cpu

发生错误:ORA-00907:缺少右括号。无法执行查询 有人可以帮我找出错误。

2 个答案:

答案 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避免两次读取基表,但我只会考虑性能差;否则这个解决方案看起来很干净,很容易向任何人解释并维护。