Oracle订单不适用于DUAL的Subquery

时间:2015-02-11 09:54:54

标签: sql oracle subquery sql-order-by

大家好,当我执行此查询时,它会抛出以下错误 -

ORA-00907: missing right parenthesis

但是,如果您从order by 1移除其SELECT 2 FROM DUAL order by 1工作。

我是否遗漏了这里的内容或其ORACLE限制

SELECT (CASE
        WHEN EXISTS
               (SELECT 1 FROM DUAL) THEN
               (SELECT 4
                FROM dual)
        ELSE
              (SELECT 2 FROM DUAL order by 1 )
    END) AS DELEGATOR FROM dual

以下是已删除订单的工作代码

SELECT (CASE
        WHEN EXISTS
               (SELECT 1 FROM DUAL) THEN
               (SELECT 4
                FROM dual)
        ELSE
              (SELECT 2 FROM DUAL )
    END) AS DELEGATOR FROM dual

3 个答案:

答案 0 :(得分:1)

不知怎的,我已经放弃但是当我将代码更改为此时 它以某种方式工作。我申请了我的实际查询和结果 是预期的结果。

SELECT(CASE         什么时候存在                (选择1来自双)然后                (选择4                 从双)         其他               (select * from(SELECT 2 FROM DUAL order by 1)               其中rownum = 1)     END)AS DELEGATOR FROM dual

答案 1 :(得分:0)

scalar subquery expression从一行返回一个列值。如果表达式返回多行,则会出现错误," ORA-01427:单行子查询返回多行"。由于它只能有一个值,因此对该值进行排序将毫无意义。

缺少右括号错误并不一定意味着您有不平衡的括号,它可以指示使解析器在预期看到的位置放弃的其他错误。在这里,解析器期望子查询的右括号在FROM DUAL之后,所以当它没有看到一个时它停止 - 实际上它并不知道如何解释声明的其余部分,以便它不会尝试(非常简单化)。

order by子句在子查询中没有意义,通常是不允许的;虽然在某些地方可以容忍,例如内联视图,尽管仍然没有效果。

显然你的例子非常有用,但有一种情况你可能认为你想要一个order by子句,那就是从你需要订购的结果集中获取第一个值。根据限制在其他数据库中的工作方式,您可能会尝试执行以下操作:

select (
  select object_name from user_objects
  where rownum = 1
  order by created desc
)
from dual

......但这并不是rownum如何运作,也会得到ORA-00907。如果这就是您正在做的事情,您将需要另一层子查询(现在作为内联视图)可以订购,并将rownum过滤器应用于:

select (
  select object_name from (
    select object_name from user_objects
    order by created desc
  )
  where rownum = 1
)
from dual

...现在有效。

(无论你是否真的需要在子查询中进行,而不是通过连接,这是另一回事 - 您的查询有望复杂到足以保证它。)

答案 2 :(得分:0)

  

SELECT 2 FROM DUAL order by 1

首先,ORDER BY在这里没有意义,查询只返回一行。

其次,当没有排序行的意义时,你不能在Scalar Subquery Expression中使用order by。在外部查询期望有序行集的某些情况下,将允许排序。在您的情况下,不存在超过单行的问题。

第三,编码为order by 1,2等不是一种好的做法。而是使用适当的列名。您可能不会知道选择列表中的列是否发生更改,然后您的结果集会以不同方式排序,您需要在这两个位置进行更改。