0RA-00905:missing keyword insert into select和select into from

本文介绍了在Oracle与SQL Server数据库中如何使用insert into select语句进行数据拷贝,并解释了select into from语句在Oracle中的限制。此外还提供了两种常见重复记录的处理方法,包括如何删除完全重复的记录以及如何保留关键字段首次出现的记录。

0RA-00905:missing keyword

两张表进行数据的拷贝,最常用的拷贝语句是:insert into select和select into from
但是请绝对的注意:
在Oracle中select into from不可以使用!原因很简单:select into是PL/SQL language 的赋值语句!如果使用则Oracle会抛出0RA-00905:missing keyword的异常!
但是可以用create table select代替该功能!
但是在Sql Server中可以正常使用。

 

select id,count(1) as num from tablename group by id having count(1)>1
order by num desc

 

“重复记录”有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。

1、对于第一种重复,比较容易解决,使用
        select distinct * from tableName
  就可以得到无重复记录的结果集。
  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
        select distinct * into #Tmp from tableName
        drop table tableName
        select * into tableName from #Tmp
        drop table #Tmp
  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
        select identity(int,1,1) as autoID, * into #Tmp from tableName
        select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
        select * from #Tmp where autoID in(select autoID from #tmp2)
  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)

 

总结:
数据拷贝,建议使用insert into select;

<think> 我们正在解决的错误是:执行SQL语句 `SELECT status, comunt(*) FROM v$session3 GROUP BY status;` 时出现 `ORA-00936: missing expression`。 根据错误信息,我们分析如下: 1. **ORA-00936错误原因**:通常表示SQL语句中缺少了必要的表达式。常见情况包括: - 遗漏了SELECT列表中的列或表达式 - 遗漏了必要的关键字(如GROUP BY时遗漏了聚合函数) - 表名或列名拼写错误 - 使用了错误的函数名 2. **检查原SQL语句**: ```sql SELECT status, comunt(*) FROM v$session3 GROUP BY status; ``` - 观察发现,`comunt(*)` 是一个明显的拼写错误。正确的聚合函数应该是 `COUNT(*)`。 3. **修正语句**: ```sql SELECT status, COUNT(*) FROM v$session GROUP BY status; ``` 同时,注意表名 `v$session3` 可能是笔误,Oracle动态性能视图通常为 `v$session`(没有数字3)。所以应该改为 `v$session`。 4. **验证表名**: -Oracle中,会话视图的正确名称是 `v$session`(动态性能视图),而不是 `v$session3`(除非用户自定义了这样的视图,但标准不存在)。 因此,正确的SQL语句应该是: ```sql SELECT status, COUNT(*) FROM v$session GROUP BY status; ``` 5. **执行权限**:执行此查询需要用户具有 `SELECT` 权限于 `v_$session`(通常通过公共同义词 `v$session` 访问)。如果没有权限,需要DBA授权: ```sql GRANT SELECT ON v_$session TO <your_user>; ``` 6. **其他可能问题**:如果问题仍然存在,检查是否有其他语法错误,例如: - 确保没有遗漏逗号或多余符号 - 确保关键字正确(如GROUP BY拼写正确) 总结:修正拼写错误(`comunt`改为`COUNT`,`v$session3`改为`v$session`)即可解决。 修正后的SQL: ```sql SELECT status, COUNT(*) FROM v$session GROUP BY status; ``` 执行该语句将显示每个状态(如ACTIVE、INACTIVE)的会话数量。 如果问题仍未解决,请检查Oracle版本(`SELECT * FROM v$version;`)以确保视图存在。 §§相关问题§§ 1. 如何查询Oracle中当前所有会话的详细信息? 2. 如何解决ORA-00942(表或视图不存在)错误? 3. Oracle动态性能视图(如v$session)的访问权限如何配置? </think> ### 解决SQL语句报错 "ORA-00936: missing expression" 的方法 您的SQL语句存在两个关键语法错误导致ORA-00936错误: ```sql SELECT status, comunt(*)FROM v$session3GROUP BY status; ``` #### 错误分析与解决方案: 1. **拼写错误:`comunt()` &rarr; `count()`** 正确使用聚合函数: ```sql SELECT status, count(*) -- 正确拼写是count FROM v$session -- 去掉数字3 GROUP BY status; ``` 2. **视图名称错误:`v$session3` &rarr; `v$session`** Oracle动态性能视图的正确名称是 `v$session`(没有数字3): ```sql SELECT status, count(*) FROM v$session -- 标准视图名称 GROUP BY status; ``` #### 完整修正后的SQL: ```sql SELECT status, count(*) AS session_count FROM v$session GROUP BY status; ``` #### 执行示例结果: ``` STATUS SESSION_COUNT ------- ------------- ACTIVE 23 INACTIVE 15 SNIPED 2 ``` --- ### 错误原因深度解析 ORA-00936错误通常由以下原因引起: 1. $$ \begin{cases} \text{缺少关键表达式} & \text{(如聚合函数count)} \\ \text{关键字拼写错误} & \text{(comunt&rarr;count)} \\ \text{对象名称错误} & \text{(v\$session3&rarr;v\$session)} \\ \text{缺少逗号分隔符} & \text{(status与count之间)} \end{cases} $$ 2. **动态视图说明**: `v$session` 是Oracle内置的动态性能视图,用于监控会话状态,不存在 `v$session3` 视图[^1] 3. **权限验证**: 若修正后仍报错,检查视图访问权限: ```sql SELECT * FROM v$fixed_table WHERE name LIKE 'V$SESSION'; ``` --- ### 预防措施 1. **使用SQL格式化工具** 推荐SQL Developer的自动格式化功能(快捷键Ctrl+F7) 2. **启用错误辅助** 在SQL*Plus中设置: ```sql SET ERRORLOGGING ON SHOW ERRORS ``` 3. **编写规范建议**: ```sql -- 标准写法模板 SELECT column1, count(*) AS alias -- 聚合函数+别名 FROM schema.object_name -- 正确对象名 WHERE conditions -- 条件子句 GROUP BY grouping_column; -- 分组列 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值