同表hist取两个别名执行JOIN查询报ORA-00904错误如何解决?
报错原因
你遇到的ORA-00904: A.id invalid identifier错误核心有两个诱因:
- 混用了旧式逗号分隔的表连接语法和ANSI JOIN语法,Oracle语法解析时
JOIN关键字优先级高于逗号分隔的表列表,执行hist b JOIN acq c的关联逻辑时,只能识别到b、c两个表的别名,无法识别逗号前定义的a别名 - 给
acq表指定别名c后,关联条件中仍然使用原表名acq引用字段,违反别名使用规则
修正后的SQL
全部使用ANSI JOIN语法即可解决问题,同表取多别名的操作本身是合法的:
SELECT count(a.id) FROM hist a INNER JOIN hist b ON a.id = b.id AND a.status = 'OK' AND b.status = 'passed' AND a.timestamp - b.timestamp > 30 INNER JOIN acq c ON c.id = a.id AND c.src = 'g9x'
注意事项
- 统一使用ANSI JOIN语法不仅可以避免语法解析优先级导致的别名识别问题,代码可读性也更高
- 为表指定别名后,所有引用该表字段的位置都要使用别名,不能再使用原表名
内容的提问来源于stack exchange,提问作者user5428151
相关产品推荐
相关产品推荐

