我正在编写一个简单的诊断查询,然后尝试在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如何工作的东西?
答案 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 *永远不允许。明确定义您需要的列;它不仅更具可读性,而且不太可能出现问题