【问题标题】:order by asc and desc按 asc 和 desc 排序
【发布时间】:2014-07-11 15:26:24
【问题描述】:

我需要从表中选择一些行,但这些行必须按ROWNUMBER asc 排序,如果ROWNUMBER 为空,我必须按created 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

甲骨文10g;

【问题讨论】:

  • ORDER BY ROWNUMBER, CREATED DESC 适合您吗?如果不是,与所需结果集有什么区别?您可以添加所需排序的小例子来提问吗?

标签: sql oracle sql-order-by


【解决方案1】:
  1. 由于您指定了 FIN_CGU.* 而不是完整的列列表,因此不清楚您提到的 created desc 是什么。
  2. 如果您指的是 SELECT MSG.GROUP_ID AS R_GR, MAX(MSG.CREATED) AS M_DATEcreated 在该列表中,然后您需要将该列从您的动态视图被引用为 RES(内部引用为 AGGR_RES)到列的顶部列表。
  3. 一旦您在列列表中拥有该列,您的内部查询似乎应该提供排序;所以你可以通过 casenvl 来做:

    当 ROWNUMBER 不为空时按大小写排序,否则 ROWNUMBER 创建结束

  4. 您不能在静态查询中动态地在同一列列表上触发 asc|desc。你可以在动态 SQL 中做到这一点。您可以更改排序列(已显示)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 2015-03-05
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多