替换JOIN USING为JOIN ON后无法选择关联列的SQL报错问题
问题解决:ORA-00904: study_event_id: invalid identifier
问题根源
你的中间子查询使用SELECT *时,lefttable(来自v_study_event和v_subject的连接)与righttable(来自v_subject_current_event_status)都包含study_event_id列,导致结果集中出现重复的列名。Oracle不允许直接引用重复列名,因此外层查询无法识别study_event_id。
解决方案
方案1:明确指定所需列,避免重复
将中间子查询的SELECT *替换为明确列出需要的列,只保留一个study_event_id(由于LEFT JOIN条件是两表的study_event_id相等,取任意一个均可):
SELECT study_event_id FROM ( SELECT lefttable.*, -- 仅列出righttable中需要的非重复列,替换为实际业务需要的列 righttable.status, righttable.update_time FROM ( SELECT ea.*, sbj.subject_id FROM v_study_event ea, v_subject sbj ) lefttable LEFT OUTER JOIN ( SELECT * FROM v_subject_current_event_status ) righttable ON righttable.study_event_id = lefttable.study_event_id ) tbl
方案2:给重复列取别名
如果需要保留两表的study_event_id,给其中一个列添加别名,外层查询通过别名引用:
SELECT event_id -- 使用别名引用 FROM ( SELECT lefttable.*, righttable.study_event_id AS event_id, -- 给righttable的重复列取别名 righttable.other_column -- 列出其他需要的列 FROM ( SELECT ea.*, sbj.subject_id FROM v_study_event ea, v_subject sbj ) lefttable LEFT OUTER JOIN ( SELECT * FROM v_subject_current_event_status ) righttable ON righttable.study_event_id = lefttable.study_event_id ) tbl
补充说明
当你使用SELECT *时,结果集确实包含两个study_event_id,但Oracle无法判断你要引用哪一个,因此单独指定列名会报错。必须通过明确列或别名的方式消除歧义。
内容的提问来源于stack exchange,提问作者Basje313
相关产品推荐
相关产品推荐

