PL/SQL中同表两次内连接实现多语言查询时的ORA-00904错误排查与解决
最近在做PL/SQL多语言内容查询的时候踩了个坑,折腾了好一会儿才解决,给大家分享下整个过程:
需求与初始尝试
我需要编写一条PL/SQL查询,通过两次内连接同一张描述表(descr_table)来实现多语言内容展示,把法语和英语的描述分别查出来。最初写的语句是这样的:
SELECT table1.code Code, table2.descr DescrFr, table3.descr_en DescrEn FROM main_table table1 INNER JOIN descr_table table2 ON table1.code = table2.code AND table2.lang = 'fr' INNER JOIN descr_table table3 ON table1.code = table3.code AND table3.lang = 'en'
结果在SQL Developer里执行时,一直提示SELECT子句存在无效标识符错误,说table2无效。当时翻了不少资料,都没找到针对这个场景的有效排查方案,一度以为是连接语法出了问题。
第一次修改尝试
后来按照建议,把语言筛选条件移到了WHERE子句里,修改后的语句如下:
SELECT table1.code AS Code, table2.descr AS DescrFr, table3.descr AS DescrEn FROM main_table table1 INNER JOIN descr_table table2 ON (table1.code = table2.code) INNER JOIN descr_table table3 ON (table1.code = table3.code) WHERE (table2.lang = 'fr' AND table3.lang = 'en');
结果还是报错,错误信息是:
Erreur SQL : ORA-00904: "TABLE3"."code" : identificateur non valide(ORA-00904: "TABLE3"."code":无效标识符)
这时候我更困惑了,连接逻辑看起来完全没问题啊,怎么会提示table3.code无效呢?
最终排查与解决
折腾了半天之后,我才突然想到去核对descr_table的表结构——结果发现问题根本不在连接语法上!是我在查询里用错了列名!原来descr_table里和main_table关联的列根本不叫code,我一直想当然地用了错误的列名进行连接。
修正了列名之后,最初写的那条查询语句居然直接就能正常执行了!
内容的提问来源于stack exchange,提问作者Vince
相关产品推荐
相关产品推荐

