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

Oracle用Dual创建虚拟表后指定列查询报ORA-00904错误求助

ORA-00904错误原因分析(Oracle虚拟表查询问题)

问题场景

在Oracle中用Dual表创建虚拟表时,执行SELECT * FROM DUMMY能正常返回数据,但执行SELECT id, bank FROM DUMMY时抛出错误:

sql - ORA-00904: invalid identifier

使用的SQL代码如下:

WITH
  DUMMY as 
    (   
        Select 1 "id", 'UBS' "bank" From Dual Union ALL
        Select 2, 'Credit Suisse' From Dual
    )
 -- SELECT * FROM DUMMY  it work
 SELECT id, bank FROM DUMMY -- it dont WORK, why?

问题原因

Oracle里,用双引号"包裹列名时,会强制区分列名的大小写。你定义虚拟表DUMMY时,给列名加了双引号,实际存储的列名是小写的id和bank。

但查询时写的SELECT id, bank FROM DUMMY,Oracle默认会把未加双引号的标识符转成大写,也就是实际会去查找ID和BANK这两个列——而你的虚拟表里根本没有这两个大写列,所以触发了ORA-00904无效标识符错误。

至于SELECT *能正常运行,是因为*会直接返回所有列,不需要指定列名,自然不会碰到大小写匹配的问题。

解决方法

有两种可行的解决方式:

  1. 查询时给列名加上双引号,保持和定义时的大小写一致:
WITH
  DUMMY as 
    (   
        Select 1 "id", 'UBS' "bank" From Dual Union ALL
        Select 2, 'Credit Suisse' From Dual
    )
SELECT "id", "bank" FROM DUMMY;
  1. 定义虚拟表时,不要用双引号包裹列名,让Oracle自动按默认规则处理为大写:
WITH
  DUMMY as 
    (   
        Select 1 id, 'UBS' bank From Dual Union ALL
        Select 2, 'Credit Suisse' From Dual
    )
SELECT id, bank FROM DUMMY;

内容的提问来源于stack exchange,提问作者the_driver

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 02:23:13