Ваша проблема заключается в подзапросе оператора 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')
Данные примера и желаемые результаты помогут объяснить, что вы пытаетесь сделать. –
Каковы типы полей: 'FECHAS.FECHA' и' FECHAS.HORA_INICIO' и 'PROGRAMACIONES.FECHA_INICIO'? –
Fecha - это только дата в поле DATE. HORA_INICIO - это временная часть поля DATE, а FECHA_INICIO - это то же самое, что и fecha @JorgeCampos – slozano95