2017-05-01 1 views
0

私は、大学の小さなプロジェクトでパートナーが行ったこのSQLクエリを持っていますが(これは初めてSQLを使用しています)、ora-00907エラーが発生し、その理由がわかりません。SQL照会でORA-00907が表示されるのはなぜですか?

私はかっこをチェックしていますが、問題は別のものでなければなりません。

select 
    persona.nombre, 
    anyo, 
    t2.total 
from persona join 
(
    select 
     t1.idPersona, 
     count(produccion.anyo) as total, 
     anyo 
     from 
     (
      select * 
      from produccion 
      join pelicula 
       on produccion.id = pelicula.id 
     ) as pel 
     join 
     (
      select * 
      from participa 
      where idPapel = 8 
     ) as t1 
      on t1.idProduccion = pel.id 
    ) 
    group by t1.idPersona 
) as t2 
    on persona.id = t2.idPersona 
where t2.total > 2 
order by t2.total desc; 
+0

'からプロデュースはproduccion.id = pelicula.id'でpeliculaに参加します(また、 'pel.id' with'production.id') –

+0

編集中にクエリが変更された可能性がありますが、カッコがアンバランスであると思います。あなたのような状況では、クエリをきちんと整形するのに非常に役立ちます。多くの場合、それを行うだけで問題が明らかになります。 –

+0

私は3つの開閉括弧を数えます。 –

答えて

0

多くのネストされたビューがあるため、デバッグが難しくなります。あなたは大括弧を持っており、一致する必要があります。

とにかくこれは間違っています:select t1.idPersona, count(produccion.anyo) as total, anyo。 GROUP BY句にanyoを含める必要があります。これにより、必要な結果セットが変更される可能性があります。

select persona.nombre, 
     t2.anyo, 
     t2.total 
from persona join 
     (select t1.idPersona, 
       count(produccion.anyo) as total, 
       anyo 
     from (select * 
       from produccion 
        join pelicula 
        on produccion.id=pelicula.id) pel 
       join 
       (select * 
       from participa 
       where idPapel=8) t1 
       on t1.idProduccion=pel.id 
     group by t1.idPersona, t1.anyo) t2 
    on persona.id=t2.idPersona 
where t2.total>2 
order by t2.total desc; 
0

問題が発生している1つの列で*を選択してグループ化しています。グループごとに条件を満たす列のみを選択するか、グループを削除します。コードセクションの上

select * 
       from (produccion join pelicula on produccion.id=pelicula.id) as pel 
       join 
       (select * 
       from participa 
       where idPapel=8) as t1 
       on t1.idProduccion=pel.id) 
     group by t1.idPersona 

によるグループの許可されていない使用です。

by groupが必要な場合は、後で最後に使用することをおすすめします。もう1つの選択肢は、分析関数を使用して、あなたがすでに持っているクエリの上位ネスト内の不要なレコードをフィルタすることです。

私はあなたのクエリは次のように修正/簡素化を図ることができると思い
+0

これは、グループの最後では、最初の行のselect句に表示されるすべての列を配置する必要があるからです。 @Himanshu – alberto

0

:pel`が私には奇妙に見えるよう、から `と交換してください(produccionがproduccion.id = pelicula.idにpeliculaに参加)

select persona.nombre, 
     anyo, 
     t2.total 
from persona 
join (
      select  par.idPersona, 
         count(produccion.anyo) as total, 
         anyo 
      from  produccion 
      join  pelicula 
        on produccion.id = pelicula.id   
      left join participa par   
        on par.idProduccion = pelicula.id -- or produccion.id, 
                -- this was also an error in the original query, 
                -- since the subquery selected both 
        and par.idPapel = 8  
      group by t1.idPersona 
      ,   anyo -- Was missing, but it also doesn't make sense, as this is what you count, so you'll just get 1's here. What do you want with this? 
     ) as t2 
    on persona.id = t2.idPersona 
where t2.total > 2 
order by t2.total desc; 
+0

私がやりたかったのは、同じ年に3つ以上の映画に参加した映画監督のリストを、降順で並べることです(映画は合計で同じ年に監督されます)。@HoneyBadger – alberto

関連する問題