【问题标题】:Order by in the nested select statement [duplicate]在嵌套的选择语句中排序[重复]
【发布时间】:2016-01-07 02:31:51
【问题描述】:

我正在尝试在嵌套的 select 语句中使用 order by 子句,但它给出了错误 ora-00907 missing paranthesis

Select a.column_name,
       (Select upper(cmnt_type) AS CMNT_TYPE
        from t_tbm_appl_comment_2015
        where appl_mnm_id=a.appl_mnm_id
           AND rownum = 1
        order by cmnt_type desc)
from MD_OTHER_OBJECTS a

【问题讨论】:

  • AND rownum = 1 order by cmnt_type desc 你不明白 ROWNUM 是如何工作的。我认为这是一个典型的 XY 问题。您的问题在于理解 ROWNUM 而不是 ORDER BY。

标签: sql oracle oracle11g


【解决方案1】:

我不知道你到底想通过使用“RoWNUM =1 with Order by desc”子句来实现什么,但是从这个 SQL 中删除 ORA-00907 的解决方案是删除 Order by,因为你不能删除 ROWNUM 子句,否则它会给你 ORA-01427 错误。而且在使用“Rownum = 1”时添加Order by 子句也没有任何意义。

所以你的 SQL 应该是这样的:

 Select a.column_name,
           (Select upper(cmnt_type) AS CMNT_TYPE
            from t_tbm_appl_comment_2015
            where appl_mnm_id=a.appl_mnm_id
               AND rownum = 1)
    from MD_OTHER_OBJECTS a;

【讨论】:

    【解决方案2】:

    正如 Lalit 所提到的,您的问题是您试图选择一行然后对其进行排序,这并不能满足您的需求。

    您必须重写您的子查询以先进行排序,然后过滤到外部查询中的一行,如下所示:

    select cmnt_type
    from   (select   upper(cmnt_type) AS CMNT_TYPE
            from     t_tbm_appl_comment_2015 tac
            where    tac.appl_mnm_id = a.appl_mnm_id
            order by cmnt_type desc)
    where  rownum = 1
    

    但是,如果您要在查询的选择列表中使用它,您最终会收到 ORA-00904: "A"."APPL_MNM_ID": invalid identifier 错误,因为相关查询只能引用下一级的外部查询下来。

    既然您似乎正在尝试获得最大的上部(cmnt_type),为什么不使用 MAX() 来代替?

    例如:

    select a.column_name,
           (select max(upper(cmnt_type))
            from   t_tbm_appl_comment_2015 tac
            where  tac.appl_mnm_id = a.appl_mnm_id) cmnt_type
    from   md_other_objects a;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-05
      • 2017-09-15
      • 2021-04-07
      • 1970-01-01
      • 1970-01-01
      • 2019-02-04
      • 1970-01-01
      相关资源
      最近更新 更多