2014-05-22 111 views
0

我需要从表中选择一些行,但行必须按ROWNUMBER asc进行排序,如果ROWNUMBER为空,则必须按created desc排序;order by asc and desc

这是我的sql查询,没有按条件排序;

SELECT FIN_CGU.*, RES.ROWNUMBER 
    FROM COMM$GROUP_USER FIN_CGU 
    FULL JOIN (SELECT AGGR_RES.R_GR AS TOT_GR, 
        ROW_NUMBER() OVER(ORDER BY AGGR_RES.M_DATE DESC) AS ROWNUMBER 
       FROM (SELECT MSG.GROUP_ID AS R_GR, MAX(MSG.CREATED) AS M_DATE 
         FROM COMM$MESSAGE MSG 
         JOIN COMM$GROUP_USER GR_USR 
         ON GR_USR.GROUP_ID = MSG.GROUP_ID 
         JOIN COMM$GROUP GR 
         ON GR.ID = MSG.GROUP_ID 
         WHERE GR.STATE <> 'DELETED' 
         AND GR_USR.STATE <> 'DELETED' 
         AND MSG.STATE <> 'DELETED' 
         AND GR_USR.USER_ID = 9172771513163989084 
         GROUP BY MSG.GROUP_ID) AGGR_RES 
       ORDER BY AGGR_RES.M_DATE DESC) RES 
    ON FIN_CGU.GROUP_ID = RES.TOT_GR 
    JOIN COMM$GROUP CG 
    ON FIN_CGU.GROUP_ID = CG.ID 
WHERE (ROWNUMBER IS NULL OR ROWNUMBER BETWEEN 1 AND 3) 
    AND FIN_CGU.USER_ID = 9172771513163989084 
    AND RES.ROWNUM <= 3 
ORDER BY 

Oracle 10g;

+0

是ORDER BY ROWNUMBER,造就了DESC为你的作品?如果不是,与期望的结果集有什么不同?你可以添加一个想要排序的小例子吗? – ThinkJet

回答

1
  1. 目前还不清楚什么创建递减你提到由于您指定FIN_CGU的事实。*,而不是整个列的列表。
  2. 如果你指的是 SELECT MSG.GROUP_ID AS R_GR,MAX(MSG。CREATED)AS M_DATE在列表中创建那么你需要把该列从您的是动态视图引用为RES(并且内部引用为AGGR_RES)到列的顶部列表。
  3. 一旦你在列表中有列,看起来你的内部查询应该提供排序;在同一递减|

    ORDER BY情况下ROWNUMBER不为空,则ROWNUMBER人创建的最终

  4. 你水湿触发器ASC:这样你就可以通过情况下NVL因为这样做既静态查询动态列列表。你可以在动态SQL中做到这一点。你可以改变顺序列虽然(如图所示)