【问题标题】:MySQL developer here -- Nesting with select * finicky in Oracle 10g?MySQL 开发人员在这里——在 Oracle 10g 中使用 select * 进行嵌套?
【发布时间】:2011-02-19 14:10:11
【问题描述】:

我正在编写一个简单的诊断查询,然后尝试在 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: Column Ambiguously Defined”。我不认为这种说法会发生这种情况,所以我有点困惑。

 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 工作原理的问题?

【问题讨论】:

    标签: mysql oracle oracle10g ora-00918


    【解决方案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 吗?如果是这样,为什么要使用外连接?

    【讨论】:

    • 有趣,说得通。如果要拒绝第二个语句,oracle 不应该拒绝第一个语句吗? “你真的想过滤掉 NULL 吗?如果是这样,为什么还要使用外连接?”没有。我从别人那里偷了这个查询,那个 AND 语句确实是完全随机的——我不知道他们为什么把它放在那里,当然他们的意思是 ''——但事实上我不能把东西包装起来围绕“Select *”让我大发雷霆,因为如果 select * 完全有效,这似乎违反了一些基本原则。你的解释很有道理,谢谢。 ;)
    【解决方案2】:

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

    【讨论】:

    • 就像我在第一句话中所说的那样,这是一个简单的诊断查询,我将出于自己的目的在暂存器中运行。这太花哨了,我应该能够做到——我从不将 select *s 放在实际代码中,但当它们放在我的本地硬盘驱动器上时我会整天写它们,我用它们私下查看表格和调试东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多