2016-10-16 48 views
0
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 
             ) as t ); 

エラーが発生しました:ORA-00907:右括弧がありません。クエリを実行できません 誰かがエラーを見つけ出すのを手伝ってください。残念ながら、Oracleはテーブル別名にasを許可していませんエラーが発生しました:ORA-00907:右括弧がありません。クエリを実行できません。

答えて

1

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; 
+0

ご質問ありがとうございます –

+0

@parthshah。 。 。この質問は構文エラーです。これは、 'from'節の' as 'によって引き起こされると信じています。別の質問がある場合は、*別の質問としてそれを聞かなければなりません。 –

0

サブクエリのアプローチを簡素化することができます:それは、テーブル内のグループ行を:(HAVING条件で)サブクエリがどのように動作するか

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 
            ); 

お知らせpmnameで除算すると、各グループ内で別々のactorlistが計算され、すべてのグループ(すべてがmnames)でMAXをとります。

ここでは、テーブルや列のエイリアスを使用するメリットはありません。 psというテーブルのエイリアシングには何の意味もありません。カラム名を完全修飾する必要がある場合でも、p.actorlistは完全に問題ありません。エイリアスを使用しないことにより、将来の開発者は、サブクエリが自己完結型であることを明確にします(外部クエリの何にも関連付けられていません。単に自己完結した形で数値を計算し、 HAVING句へ)。

この場合、分析関数が必要であると私は確信していません。 (もちろん、GROUP BYソリューションにはネストされたサブクエリのレベルが異なるため、分析関数を考慮する理由はもうありません)。パフォーマンスが悪い場合はそれで、そうしないと、この解決策は誰にでも説明して維持するのがきれいで簡単です。

関連する問題