您好我试图从子查询中获取一行,其中子查询与主查询相同
错误是
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时,它没有找到主查询
由于
答案 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')