我想找到第二个最小的cat1_in_flag和cat2_in_flag,但是在这种情况下,我得到了这个错误,你可以请任何人建议我如何解决这个问题。
select trip_id,
(SELECT T1||' to '||T2 FROM(
SELECT cat1_in_flag T1,cat2_in_flag T2,
DENSE_RANK()OVER(ORDER BY min(to_number(cat1_in_flag)),min(to_number(cat2_in_flag))) RM
FROM TRIP_DTL
WHERE TRIP_ID = A.TRIP_ID
GROUP BY cat1_in_flag,cat2_in_flag
)WHERE RM=2)
from trip_mst A
ORA-00904: "A.TRIP_ID": invalid identifier
00904. 00000 - "%s: invalid identifier"
*Cause:
*Action:
Error at Line: 17 Column: 20
答案 0 :(得分:0)
您可以尝试以下查询来获得相同的结果:
SELECT
TRIP_ID,
T1
|| ' to '
|| T2
FROM
(
SELECT
TRIP_ID,
CAT1_IN_FLAG T1,
CAT2_IN_FLAG T2,
ROW_NUMBER() OVER(
ORDER BY
TO_NUMBER(CAT1_IN_FLAG), TO_NUMBER(CAT2_IN_FLAG)
) RM
FROM
TRIP_MST A
JOIN TRIP_DTL B ON ( A.TRIP_ID = B.TRIP_ID )
)
WHERE
RM = 2
干杯!
-----更新-----
根据评论中提到的情况更新了答案。
现在,您可以将TRIP_MST表与其他表连接:
SELECT
TRIP_ID,
T1
|| ' to '
|| T2
FROM
TRIP_MST A
JOIN (
SELECT
TRIP_ID,
CAT1_IN_FLAG T1,
CAT2_IN_FLAG T2,
ROW_NUMBER() OVER(
ORDER BY
TO_NUMBER(CAT1_IN_FLAG), TO_NUMBER(CAT2_IN_FLAG)
) RM
FROM
TRIP_DTL
) B ON ( A.TRIP_ID = B.TRIP_ID )
WHERE
B.RM = 2;
干杯!
答案 1 :(得分:0)
错误是因为对于您的旧Oracle版本,对a.trip_id
的引用嵌套太深。等效于此:
select dummy
, ( select testcol
from ( select 123 as testcol from dual
where dummy = a.dummy )
) as testcol
from dual a;
ORA-00904: "A"."DUMMY": invalid identifier
因为对A
的引用下降了两级,所以看不到它。如果将版本更改为更高版本,它将在dbfiddle中成功。
如果更清楚地了解了您拥有的数据和想要看到的结果,那么应该可以建议使用11g替代查询。