Oracle 8i子查询引用外层表字段报无效标识符如何解决
你遇到的报错是Oracle 8i的固有语法限制导致的:该版本不支持在超过1层嵌套的子查询中引用外层查询的表字段。你现有写法里CASE分支的子查询嵌套了两层(内层查SIGNOFF表排序、外层包一层取ROWNUM=1),所以最内层的WHERE条件无法识别外层的D表字段。
另外注意你原查询里还有个笔误:你写的D.DISCREPANCY_STATUS字段不存在,你给出的NCM_DISCREPANCY表的状态字段是STATUS,需要同步修正。
方案1:用聚合函数绕开多层嵌套(最简洁,适配8i)
用Oracle支持的KEEP DENSE_RANK聚合语法,直接取SEQUENCE_NUMBER最大对应的GROUP_NAME,不需要嵌套两层子查询,只有一层子查询可以正常引用外层D表的字段:
SELECT CASE WHEN D.STATUS = 'OPEN' THEN ( SELECT MAX(t.GROUP_NAME) KEEP (DENSE_RANK LAST ORDER BY t.SEQUENCE_NUMBER) FROM NCM_SIGNOFF@ncmsp t WHERE t.NCR_KEY = D.NCR_KEY AND t.DISCREPANCY_NUMBER = D.DISCREPANCY_NUMBER ) ELSE NULL END AS "Current Group" FROM NCM_HEADER@ncmsp H LEFT JOIN NCM_DISCREPANCY@ncmsp D ON D.NCR_KEY = H.NCR_KEY WHERE D.NCR_KEY = 4412717 AND D.DISCREPANCY_NUMBER = 1
方案2:关联后统一排序取首条
如果不想在CASE里写子查询,也可以把三张表关联后再排序取第一条,同样适配8i版本:
SELECT * FROM ( SELECT t.GROUP_NAME AS "Current Group" FROM NCM_HEADER@ncmsp H LEFT JOIN NCM_DISCREPANCY@ncmsp D ON D.NCR_KEY = H.NCR_KEY LEFT JOIN NCM_SIGNOFF@ncmsp t ON t.NCR_KEY = D.NCR_KEY AND t.DISCREPANCY_NUMBER = D.DISCREPANCY_NUMBER WHERE D.NCR_KEY = 4412717 AND D.DISCREPANCY_NUMBER = 1 AND D.STATUS = 'OPEN' ORDER BY t.SEQUENCE_NUMBER DESC ) WHERE ROWNUM = 1
两种方案执行后都会返回你需要的GROUP3结果。
内容的提问来源于stack exchange,提问作者Iorek
相关产品推荐
相关产品推荐

