ORACLE SQL复杂排序一例

ORACLE SQL复杂排序一例-刘师傅
刘师傅
擅长邻域:Java,HTML,JavaScript,CSS,SQL,ORACLE,MySQL,SQL SERVER,Spring 全家桶

2020-10-19 14:41:16   219浏览 分类: Java

需求描述:CONTRACT_DRAFT_T为合同表,存放有主合同和关联协议(主从关系),主合同记录中的MAIN_CODE多值字段记录了所有关联的协议主键(乱序,逗号分隔),现在要通过MAIN_CODE将所有关联协议的CONTRACT_CODE字段筛选出来,且顺序与MAIN_CODE中的协议顺序保持一致。
委托人第一个版本的实现是这样的:
SELECT
CONTRACT_DRAFT_T.DRAFT_ID,
CONTRACT_DRAFT_T.MAIN_CODE,
(
SELECT
WM_CONCAT (T .CONTRACT_CODE)
FROM
CONTRACT_DRAFT_T T
WHERE
INSTR (
CONTRACT_DRAFT_T.MAIN_CODE,
T .DRAFT_ID
) > 0
) MAIN_CODE_NEW
FROM
CONTRACT_DRAFT_T
WHERE
CONTRACT_DRAFT_T.DRAFT_ID = 'B1C21F69D9795BF6E05010ACDB442D11';
第一版的SQL实现了筛选,但是没有实现排序的需求,于是就有了本次的委托。仔细分析就会发现问题的难点在于,如何将CONTRACT_CODE按照MAIN_CODE中协议出现的顺序进行排序,这里利用了INSTR函数返回的值为目标字符串(即协议主键)在源字符串(MAIN_CODE)中的出现位置,将关联协议按照返回值升序排序,即可得到对应升序排列的CONTRACT_CODE,也就满足了按照MAIN_CODE中出现顺序排序的要求。
第二版SQL实现如下:
SELECT DRAFT_ID,
MAIN_CODE,
(SELECT WM_CONCAT(CONTRACT_CODE)
FROM (SELECT T.CONTRACT_CODE
FROM CONTRACT_DRAFT_T T
WHERE INSTR((SELECT MAIN_CODE
FROM CONTRACT_DRAFT_T
WHERE DRAFT_ID = 'B1C21F69D9795BF6E05010ACDB442D11'),
T.DRAFT_ID) > 0
ORDER BY INSTR((SELECT MAIN_CODE
FROM CONTRACT_DRAFT_T
WHERE DRAFT_ID = 'B1C21F69D9795BF6E05010ACDB442D11'),
T.DRAFT_ID))) MAIN_CODE_NEW
FROM CONTRACT_DRAFT_T
WHERE DRAFT_ID = 'B1C21F69D9795BF6E05010ACDB442D11';
问题迎刃而解。

好文章就要一起分享哦!分享海报

此处可发布评论

评论(1

飞一样的编程 能力:450

2020-10-19 19:16:29

棒棒哒
点击加载更多
客服QQ 1913284695