0

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

在 Oracle 10g Enterprise Manager Console 的 SQL Scratchpad 中,此语句运行良好。

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/scratchpad 是否试图强迫我接受某种语法结构以防止过度嵌套?这是暂存器中的错误还是有关 oracle 工作原理的问题?

4

2 回答 2

1

当 Oracle 解析 aSELECT *时,它会将其扩展为要选择的列的实际列表。由于您的内联视图包含名为 的两列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 吗?如果是这样,为什么要使用外部联接?

于 2010-05-14T16:57:43.807 回答
0

在我工作的地方,一般的经验法则之一是 SELECT * 是绝对不允许的。明确定义您需要哪些列;它不仅更具可读性,而且不太可能出现问题

于 2010-05-14T15:30:49.453 回答