如何使用子查询和 wm_concat 对 Oracle SQL 中的数据进行排序

Posted

技术标签:

【中文标题】如何使用子查询和 wm_concat 对 Oracle SQL 中的数据进行排序【英文标题】:How to sort data in Oracle SQL with sub query and wm_concat 【发布时间】:2015-04-28 07:47:45 【问题描述】:

下面是一个更大查询的子查询,我要做的是让最后 5 个文档按SL_DT 降序排序。

我总是收到右括号丢失的错误,我也考虑过使用row_number() over (order by pa.last_modified_date desc),但它不起作用。

SELECT   REPLACE (
              wm_concat(   SL_TXN_CODE
                        || ' - '
                        || SL_NO
                        || '('
                        || SL_DT
                        || ') - '
                        || SUM (SL_QTY)),
              ',',
              ' ,'
           )
    FROM   STK_LEDGER
   WHERE   ROWNUM <= 5
           AND SL_ITEM_CODE =
                 (SELECT   IDH_ITEM_CODE
                    FROM   AA_ITEM_DEFINATION_HEAD
                   WHERE   IDH_SUPP_BC_1 = '111' OR IDH_ITEM_CODE = '111')
           AND SL_TXN_TYPE IN ('SARTN', 'GRN', 'LTRFI')
           AND SL_LOCN_CODE NOT IN ('D2', 'D4', 'D5')
GROUP BY   SL_TXN_CODE, SL_NO, SL_DT
ORDER BY   SL_DT DESC

请建议对SL_DT 进行降序排序并仅获取 5 条记录的最佳方法。如您所见,我需要一个字段中的所有数据。

数据库是Oracle 10g。

提前致谢。

【问题讨论】:

数据库是Oracle 10g 同意彼得的观点,将您的查询格式化为人类可以阅读的格式 请提供创建和插入语句作为示例数据。并且不要使用wm_concat,它是一个未记录的功能,并且在最新的 12c 版本中不再可用。见***.com/a/28758117/3989608 根据上述建议更新了问题。 @lalit-kumar-b,我的 oracle 版本是 10g。 @user3625561 在 10g 中,您可以使用自 9i 起可用的 ROW_NUMBER() and SYS_CONNECT_BY_PATH functions。为什么要使用已从最新版本中删除的未记录功能。如果您提供 create 和 insert 语句,将很容易为您提供帮助。至少有一个 SQL Fiddle 【参考方案1】:
SELECT VALUE
  FROM (SELECT VALUE, ROWNUM AS ROW_NUM
          FROM (SELECT REPLACE(WM_CONCAT(SL_TXN_CODE || ' - ' || SL_NO || '(' ||
                                         SL_DT || ') - ' || SUM(SL_QTY)),
                               ',',
                               ' ,') AS VALUE
                  FROM STK_LEDGER
                 WHERE SL_ITEM_CODE =
                       (SELECT IDH_ITEM_CODE
                          FROM AA_ITEM_DEFINATION_HEAD
                         WHERE IDH_SUPP_BC_1 = '111'
                            OR IDH_ITEM_CODE = '111')
                   AND SL_TXN_TYPE IN ('SARTN', 'GRN', 'LTRFI')
                   AND SL_LOCN_CODE NOT IN ('D2', 'D4', 'D5')
                 GROUP BY SL_TXN_CODE, SL_NO, SL_DT
                 ORDER BY SL_DT DESC))
 WHERE ROW_NUM <= 5

【讨论】:

WHERE 后面有一个AND,我删除了它,但仍然报错,rownum 不是单组功能。 不要使用wm_concat,这是一个未记录的功能,在最新的 12c 版本中不再可用。见***.com/a/28758117/3989608 错过了GROUP BY。遗憾的是,需要添加另一个级别的SELECT

以上是关于如何使用子查询和 wm_concat 对 Oracle SQL 中的数据进行排序的主要内容,如果未能解决你的问题,请参考以下文章

oracle拼接子查询返回的多个结果

db2数据库查询时,wmsys.wm_concat函数如何使用!

oracle如何使用wm_concat()?

PostgreSQL 中的 ORACLE wm_concat 等效项

CF1350D Orac and Medians(找规律)

oracle的sql查询结果拼接