oracle子查询里面的情况

时间:2016-02-28 20:38:22

标签: sql oracle

您好我试图从子查询中获取一行,其中子查询与主查询相同

错误是

ORA-00904: "F"."HORA_INICIO": identificador no válido
00904. 00000 -  "%s: invalid identifier"

这是我的代码

SELECT F.FECHA,
       COUNT(DISTINCT(F.CODIGO_DEPORTE)) AS CONTEODEPORTES,
       C.CONTEO AS CONTEO,
       CASE 
         WHEN C.CONTEO IS NULL THEN MIN(F.HORA_INICIO)
         ELSE (SELECT *
                 FROM (SELECT (SELECT NOMBRE_DEPORTE
                                 FROM DEPORTES
                                 WHERE PP.CODIGO_DEPORTE=DEPORTES.CODIGO_DEPORTE) AS NOM
                         FROM PROGRAMACIONES PP 
                         WHERE TO_CHAR(FECHA_INICIO, 'YYYY-MM-DD HH24:MI:SS') = 
                                 TO_CHAR(TO_DATE(F.FECHA,'DAY, DD "de" MONTH "de" YYYY'),'YYYY-MM-DD')
                                   || ' ' || F.HORA_INICIO
                         ORDER BY NOM)
                 WHERE ROWNUM=1)
       END AS PRIMER_DEPORTE
  FROM FECHAS F
  FULL OUTER JOIN CONTEO C
    ON (F.FECHA=C.FECHA AND
        F.HORA_INICIO=C.HORA_INICIO)
  GROUP BY F.FECHA,C.CONTEO
  ORDER BY TO_DATE(F.FECHA,'DAY, DD "de" MONTH "de" YYYY')

我的问题是当尝试使用F.FECHA时,它没有找到主查询

由于

1 个答案:

答案 0 :(得分:0)

您的问题出在您的案例陈述子查询中。 Oracle不太了解子查询的多个级别上的F.FECHA字段,并且您有2.由于您说您的Oracle版本是12,因此可以通过以下修改执行您想要的操作在您的查询:

SELECT F.FECHA,
       COUNT(DISTINCT(F.CODIGO_DEPORTE)) AS CONTEODEPORTES,
       C.CONTEO AS CONTEO,
       CASE 
         WHEN C.CONTEO IS NULL THEN MIN(F.HORA_INICIO)
         ELSE (  SELECT NOMBRE_DEPORTE
                   FROM DEPORTES D
                          INNER JOIN PROGRAMACIONES PP 
                                ON (D.CODIGO_DEPORTE = PP.CODIGO_DEPORTE)
                  WHERE TO_CHAR(PP.FECHA_INICIO, 'YYYY-MM-DD HH24:MI:SS') = 
                        TO_CHAR(TO_DATE(F.FECHA, 
                                        'DAY, DD "de" MONTH "de" YYYY'
                                       ),
                                'YYYY-MM-DD'
                                ) || ' ' || F.HORA_INICIO
                  ORDER BY PP.NOM
                  FETCH FIRST 1 ROW ONLY
         ) END AS PRIMER_DEPORTE
  FROM FECHAS F
  FULL OUTER JOIN CONTEO C
    ON (F.FECHA=C.FECHA AND
        F.HORA_INICIO=C.HORA_INICIO)
  GROUP BY F.FECHA,C.CONTEO
  ORDER BY TO_DATE(F.FECHA,'DAY, DD "de" MONTH "de" YYYY')

由于您没有提供任何数据,因此我们可以看到您需要的内容,因此无法向您提供有关如何更好地进行此查询的提示。如果我们能够理解数据,我确信它可以用更好的方式编写。

注意我刚刚更改了您的查询,因此CASE语句中的子查询只有一个级别,因此您可以在其中找到F.FECHA

修改

由于您使用的是Oracle 11g并且它不支持FETCH子句,因此这将是一种解决方法。我已将您的子查询添加为表格,并使用分析函数只获得一行。

SELECT F.FECHA,
       COUNT(DISTINCT(F.CODIGO_DEPORTE)) AS CONTEODEPORTES,
       C.CONTEO AS CONTEO,
       CASE 
         WHEN C.CONTEO IS NULL THEN MIN(F.HORA_INICIO)
         ELSE (ND.NOMBRE_DEPORTE) END AS PRIMER_DEPORTE
  FROM FECHAS F
       FULL OUTER JOIN CONTEO C  
             ON (    F.FECHA=C.FECHA 
                 AND F.HORA_INICIO=C.HORA_INICIO)
        INNER JOIN (SELECT NOMBRE_DEPORTE, 
                           TO_CHAR(PP.FECHA_INICIO, 'YYYY-MM-DD HH24:MI:SS') as FECHA_INICIO,
                           ROW_NUMBER() over (PARTITION by NOMBRE_DEPORTE,
                                                  TO_CHAR(PP.FECHA_INICIO, 'YYYY-MM-DD HH24:MI:SS')
                                               ORDER BY PP.NOM) as RNUMBER
                      FROM DEPORTES D
                            INNER JOIN PROGRAMACIONES PP 
                                    ON (D.CODIGO_DEPORTE = PP.CODIGO_DEPORTE)
                    ) ND ON ( ND.FECHA_INICIO = TO_CHAR( TO_DATE(F.FECHA, 
                                                                 'DAY, DD "de" MONTH "de" YYYY'),
                                                        'YYYY-MM-DD') || ' ' || F.HORA_INICIO
                              AND ND.RNUMBER = 1 )
  GROUP BY F.FECHA, C.CONTEO
  ORDER BY TO_DATE(F.FECHA,'DAY, DD "de" MONTH "de" YYYY')