【问题标题】:Oracle Order by not working for Subquery from DUALOracle Order by not working for Subquery from DUAL
【发布时间】:2015-04-11 15:25:31
【问题描述】:

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

ORA-00907: missing right parenthesis

但是,如果您从SELECT 2 FROM DUAL order by 1 中删除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

以下是删除了 order by 1 的工作代码

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

【问题讨论】:

    标签: sql oracle subquery sql-order-by


    【解决方案1】:

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

    选择(案例 何时存在 (从 DUAL 中选择 1)然后 (选择 4 从双) 别的 (select * from (SELECT 2 FROM DUAL order by 1 ) 其中rownum = 1) END) 作为双重的委托人

    【讨论】:

      【解决方案2】:

      scalar subquery expression 只返回一行中的一列值。如果表达式返回多于一行,您将收到错误“ORA-01427:单行子查询返回多于一行”。由于它只能有一个值,因此对该值进行排序是没有意义的。

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

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

      显然您的示例非常做作,但在某些情况下您可能认为您需要 order by 子句,即从需要排序的结果集中获取第一个值。根据 limit 在其他数据库中的工作方式,您可能会尝试执行以下操作:

      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
      

      ...现在有效。

      (您是否真的需要在子查询中执行此操作,而不是通过连接,是另一回事 - 希望您的查询足够复杂,可以保证这样做)。

      【讨论】:

      • 感谢您的回答。我现在正在重写查询。
      • 刚刚因为我基于新查询的最后一个查询而投票。谢谢。
      【解决方案3】:

      SELECT 2 FROM DUAL order by 1

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

      其次,如果没有对行进行排序的意义,则不能在 Scalar Subquery Expression 中使用 order by。在外部查询需要一组有序行的某些情况下,将允许排序依据。在您的情况下,获得多于单行是没有问题的。

      第三,编码为order by 1,2 等不是一个好习惯。相反,使用适当的列名。如果选择列表中的列发生更改,您可能不知道,结果集的排序会有所不同,您需要在这两个位置进行更改。

      【讨论】:

      • 第一和第二条评论。这个查询只是一个例子,所以它会返回不止一行,这就是我需要做一些排序的原因。第三个不会回答这个问题,基本上结果只是一列,所以按 1 排序就足够了。无论如何谢谢你的回答:)
      • 在我的实际查询中,它将返回不止一行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      • 2022-12-01
      相关资源
      最近更新 更多