无法从 SQLPLUS 中的 select 语句创建的表中选择数据

Posted

技术标签:

【中文标题】无法从 SQLPLUS 中的 select 语句创建的表中选择数据【英文标题】:FAIL to SELECT data from table that created by select statement in SQLPLUS 【发布时间】:2014-10-15 17:09:25 【问题描述】:

这是我的sql语句

它用于“查找每个职位的平均工资。显示职位和平均工资金额为3000或更高的人的数量。”

CREATE TABLE avgSal AS (
SELECT job, AVG(sal) AS "sal" FROM Emp GROUP BY job);

SELECT * FROM avgSal WHERE sal>3000;

然后sqlplus说

ORA-00904: "SAL": invalid identifier

我进入第二条sql语句后

有人可以帮我吗? /(T_T)\

这是我第一次使用 *** (-,-)/

【问题讨论】:

也许检查你的字段的大小写,有时它会有所不同。 欢迎来到***! :) 首先这似乎是个坏主意……如果 EMP 表被更新会发生什么?您也必须更新此表吗?为什么不把它做成一个临时表,当你只需要并且总是有更新的数据时可以查询呢?试着在你的专栏上加反引号 【参考方案1】:

您引用了列名"sal",因此它区分大小写。

引用时必须引用该列:

SELECT * 
FROM avgSal 
WHERE "sal" > 3000;

通常最好避免使用带引号的标识符。

有关标识符的更多详细信息可以在手册中找到:http://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements008.htm#SQLRF00223

但是你真的不需要创建一个表来实现你想要的:

select *
from (
  SELECT job, 
         avg(sal) AS avg_sal 
  FROM Emp 
  GROUP BY job
) t
where avg_sal > 3000;

另一种选择是使用公用表表达式:

with avgSal as (
  SELECT job, 
         avg(sal) AS avg_salary
  FROM Emp 
  GROUP BY job
) 
select *
form avgSal
where avg_salary > 3000;

【讨论】:

这里唯一需要注意的是 mysql 不支持 with 运算符,因为这就是 OP 正在使用的......但不管我 +1 :) @JohnRuddell:错误消息清楚地表明 OP 正在使用 Oracle。 哦,我的糟糕,我什至没看到...然后是 nvm :) 非常感谢。 (^v^)/ 我希望有一天我能投票给你的答案。

以上是关于无法从 SQLPLUS 中的 select 语句创建的表中选择数据的主要内容,如果未能解决你的问题,请参考以下文章

Oracle数据库的sqlplus可以直接执行SQL语句吗?

我可以在表的选择语句(sqlplus)中使用 ROWNUM < SEQUENCE.NEXTVAL 吗?

SQLPlus 批处理文件 - 如何返回到命令提示符?

在 sqlplus 中使用假脱机运行多个查询

从java运行sqlplus脚本的简单方法

尝试使用 select 语句查询数据得到 ORA-22905:无法访问非嵌套表项中的行