在嵌套的select语句中排序

时间:2015-10-09 08:14:51

标签: sql oracle oracle11g

我正在尝试在嵌套的select语句中使用order by子句,但它给出了错误ora-00907缺少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

2 个答案:

答案 0 :(得分:1)

正如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()?

E.g:

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;

答案 1 :(得分:0)

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

所以你的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;