为什么我在SQL查询中得到ORA-00907?

为什么我在SQL查询中得到ORA-00907?,sql,oracle,ora-00907,Sql,Oracle,Ora 00907,我有一个合作伙伴在大学里为一个小项目做的SQL查询(这是我们第一次使用SQL),但是我们得到了ora-00907错误,我们都不知道为什么 我已经检查了括号,它们看起来还可以,所以问题一定是另一个 select persona.nombre, anyo, t2.total from persona join ( select t1.idPersona, count(produccion.anyo) as total,

我有一个合作伙伴在大学里为一个小项目做的SQL查询(这是我们第一次使用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;

您有很多嵌套视图,这使得您的查询很难调试。你有很多括号,需要匹配

无论如何,这是错误的:
选择t1.idPersona,计数(produccion.anyo)作为总计,anyo
。您需要在GROUPBY子句中包含
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;

您正在选择*并对产生问题的一列执行分组。您可以在“分组依据”条件下仅选择相应的列,也可以删除“分组依据”

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
以上代码部分不允许使用group by

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

如果非常需要group by,我建议您稍后使用它。另一种选择是使用分析功能,并过滤掉查询上层嵌套中您已经拥有的其余未需要的记录。

我认为您的查询可以简化/更正如下:

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;

from(produccion join pelicula on produccion.id=pelicula.id)由于pel
看起来很奇怪,请将其替换为
from produccion join pelicula on produccion.id=pelicula.id
(还有
pel.id
with
production.id
)我想我可能在编辑过程中更改了您的查询,但我认为您的括号不平衡。在像您这样的情况下,整洁地设置查询的格式非常有帮助。通常,仅仅这样做就会暴露问题。我数了3个开始括号和4个结束括号。在
分组之前有一个额外的结束括号(
)。我想做的是列出一份在同一年中参与了3部或3部以上电影的电影导演名单,按降序排列(总导演数和同一年的导演数)@honeybedgerthat's,因为在小组中,到最后我需要把第一行的select子句中出现的所有列,不是吗@希曼苏