我想获取数据,但是出现类似ORA-00904的错误:“ A.TRIP_ID”:无效的标识符00904。00000-“%s:无效的标识符”

时间:2019-07-24 19:01:19

标签: sql oracle

我想找到第二个最小的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

2 个答案:

答案 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;

fails in Oracle 11.2

ORA-00904: "A"."DUMMY": invalid identifier

因为对A的引用下降了两级,所以看不到它。如果将版本更改为更高版本,它将在dbfiddle中成功。

如果更清楚地了解了您拥有的数据和想要看到的结果,那么应该可以建议使用11g替代查询。