You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 06:09:02