MySQL开发人员在这里 - 在Oracle 10g中使用select * finicky进行嵌套?

时间:2010-05-14 15:24:38

标签: mysql oracle oracle10g ora-00918

我正在编写一个简单的诊断查询,然后尝试在Oracle 10g SQL Scratchpad中执行它。编辑:它不会在代码中使用。我正在筑巢一个简单的“选择*”,它给了我错误。

在SQL Scratchpad for Oracle 10g企业管理器控制台中,此语句运行正常。

SELECT *  FROM v$session sess, v$sql     sql  WHERE sql.sql_id(+) = sess.sql_id and sql.sql_text <> ' ' 

如果我尝试将它包装在Select * from()tb2中,我会收到一个错误,“ORA-00918:列含糊不清”。我不认为这种说法会发生这种情况,所以我有点困惑。

 select * from
 (SELECT *  FROM v$session sess, v$sql     sql  WHERE sql.sql_id(+) = sess.sql_id and sql.sql_text <> ' ')
 tb2

就我所知,你应该总是能够使用这种结构从另一个select *语句的结果集中选择*对吗?

Oracle / 10g /暂存器是否试图强制我接受某种句法结构以防止过度嵌套?这是一个漏洞记录中的错误还是关于oracle如何工作的东西?

2 个答案:

答案 0 :(得分:1)

当Oracle解析SELECT *时,它会将其扩展为要选择的列的实际列表。由于您的内联视图包含两列名为SQL_ID的列,因此会产生不明确的引用。

有趣的是,使用ANSI连接语法似乎会导致它自动为重复的列名设置别名,从而避免错误。

select * from
(select * from v$session sess left outer join v$sql sql on sql.sql_id=sess.sql_id and sql.sql_text <> ' ')

顺便说一句,我不清楚为什么你在sql_text选择这个条件。我不希望该列包含单个空格。你真的想过滤掉NULL吗?如果是这样,为什么要使用外连接?

答案 1 :(得分:0)

我工作地点的一般规则是SELECT *永远不允许。明确定义您需要的列;它不仅更具可读性,而且不太可能出现问题