2016-02-28 4 views
0

Привет Im пытается извлечь строку из подзапроса, где подзапрос Fecha является такой же, как основной Fecha запросаоракул подзапрос внутри корпуса

Ошибка

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

Каковы типы полей: 'FECHAS.FECHA' и' FECHAS.HORA_INICIO' и 'PROGRAMACIONES.FECHA_INICIO'? –

+0

Fecha - это только дата в поле DATE. HORA_INICIO - это временная часть поля DATE, а FECHA_INICIO - это то же самое, что и fecha @JorgeCampos – slozano95

ответ

0

Ваша проблема заключается в подзапросе оператора case. 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 внутри него.

EDIT

Так как вы в 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') 
+0

Привет, @ JorgeCampos теперь его высказывание о том, что есть правильная скобка missin, но если я удалю заказ и принесу его, то заработает идея здесь? Благодаря! – slozano95

+0

Я пропустил ';' просто удаляю его, он должен работать –

+0

Я уже пробовал это, и он продолжает говорить то же самое – slozano95

Смежные вопросы