ORACLE SQL复杂排序一例
2020-10-19 14:41:16 1096浏览
摘要:CONTRACT_DRAFT_T为合同表,存放有主合同和关联协议(主从关系),主合同记录中的MAIN_CODE多值字段记录了所有关联的协议主键(乱序,逗号分隔),现在要通过MAIN_CODE将所有关联协议的CONTRACT_CODE字段筛选出来,且顺序与MAIN_CODE中的协议顺序保持一致。
需求描述:CONTRACT_DRAFT_T为合同表,存放有主合同和关联协议(主从关系),主合同记录中的MAIN_CODE多值字段记录了所有关联的协议主键(乱序,逗号分隔),现在要通过MAIN_CODE将所有关联协议的CONTRACT_CODE字段筛选出来,且顺序与MAIN_CODE中的协议顺序保持一致。
委托人第一个版本的实现是这样的:
第二版SQL实现如下:
委托人第一个版本的实现是这样的:
SELECT第一版的SQL实现了筛选,但是没有实现排序的需求,于是就有了本次的委托。仔细分析就会发现问题的难点在于,如何将CONTRACT_CODE按照MAIN_CODE中协议出现的顺序进行排序,这里利用了INSTR函数返回的值为目标字符串(即协议主键)在源字符串(MAIN_CODE)中的出现位置,将关联协议按照返回值升序排序,即可得到对应升序排列的CONTRACT_CODE,也就满足了按照MAIN_CODE中出现顺序排序的要求。
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实现如下:
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';
好博客就要一起分享哦!分享海报
他感兴趣的技术