Oracle如何拼接两列后和其他表值比对、解决ORA-00904报错
错误原因
Oracle的SQL执行顺序中,WHERE子句的执行优先级高于SELECT子句,你在SELECT中定义的别名al在WHERE执行阶段还未被系统识别,因此会抛出ORA-00904: "AL": invalid identifier(标识符无效)的错误。
解决方法
方案1:直接在WHERE中复用拼接逻辑
将SELECT里的拼接表达式直接复制到NOT IN的判断条件中即可:
SELECT valorA || SubStr(valorB,3,2) AS al, hours FROM table_A WHERE valorA LIKE '%RR%' AND hours > To_Date('24/09/2021 12:00','dd/mm/yyyy HH24:mi') AND (valorA || SubStr(valorB,3,2)) NOT IN ( SELECT vr FROM table_B )
方案2:用子查询/CTE提前计算别名
先通过内层查询计算出al字段,外层再做过滤,避免重复写拼接逻辑:
SELECT al, hours FROM ( SELECT valorA || SubStr(valorB,3,2) AS al, hours FROM table_A WHERE valorA LIKE '%RR%' AND hours > To_Date('24/09/2021 12:00','dd/mm/yyyy HH24:mi') ) t WHERE t.al NOT IN (SELECT vr FROM table_B)
注意:如果
table_B的vr字段存在NULL值,NOT IN会直接返回空结果,这种场景更推荐用LEFT JOIN + 空值判断的写法,逻辑兼容性更强:
SELECT t.al, t.hours FROM ( SELECT valorA || SubStr(valorB,3,2) AS al, hours FROM table_A WHERE valorA LIKE '%RR%' AND hours > To_Date('24/09/2021 12:00','dd/mm/yyyy HH24:mi') ) t LEFT JOIN table_B b ON t.al = b.vr WHERE b.vr IS NULL
内容的提问来源于stack exchange,提问作者Jovani
相关产品推荐
相关产品推荐

