如何使用子查询和 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 中的数据进行排序的主要内容,如果未能解决你的问题,请参考以下文章
db2数据库查询时,wmsys.wm_concat函数如何使用!