1. 项目需求
虚拟核销中,若起草人离职,则已办视图项目客户专员无法查看,故需新增虚拟核销项目对应客户专员查看权限。
SELECT ID,PROJECTNO, CREATOR FROM FORM_MADJ_ACCOUNT WHERE ID IN('8cfa11ee-6ef4-448a-b75b-d7c99c96a76b', 'bf7ca28c-6d97-48b7-ad6e-a7398b5a11e4')
可见,项目中存在多项目编号,|分割,故首先分离项目
2. 开始分离
SELECT DISTINCT
ID,
REGEXP_SUBSTR( PROJECTNO, '[^|]+', 1, LEVEL ) AS PROJECTNO -- 搜索正则匹配的串
FROM
YDAMS.FORM_MADJ_ACCOUNT
WHERE ID='8cfa11ee-6ef4-448a-b75b-d7c99c96a76b'
CONNECT BY LEVEL <= REGEXP_COUNT ( PROJECTNO, '|' ) + 1 -- level关键字,代表树形结构中的层级编号
AND ID = PRIOR ID -- 主键ID 表示从下往上查找数据,可以理解为从叶子节点往上查找父级节点点
AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL --该句不变
分离为多行结果:
3. 注意事项
由于在子查询中ID无法使用外部别名ID,故采用左连接查询方式
注:项目表中存在项目客户专员信息
SELECT DISTINCT id FROM table_name ORDER BY number DESC;
--- 运行时往往会报错。因为在order by中出现的number没有在select distinct中出现,所以正确的写法应该是
SELECT DISTINCT id, number FROM table_name ORDER BY number DESC;
4.最终SQL语句
SELECT
DISTINCT FMA.ID,
FMA.PROJECTNO,
to_char(fma.create_date,'yyyy-mm-dd hh24:mi:ss') as create_date,
FMA.CREATE_DATE CREATE_DATE2 -- 注意这个在ORDER BY中存在,必须写否则会报错
FROM
FORM_MADJ_ACCOUNT FMA
LEFT JOIN sys_user SU ON FMA.CREATOR = SU.ID
LEFT JOIN (
SELECT DISTINCT
ID,
REGEXP_SUBSTR( PROJECTNO, '[^|]+', 1, LEVEL ) AS PROJECTNO
FROM
YDAMS.FORM_MADJ_ACCOUNT CONNECT BY LEVEL <= REGEXP_COUNT ( PROJECTNO, '|' ) + 1
AND ID = PRIOR ID
AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL
) PSI ON FMA.ID = PSI.ID
LEFT JOIN PROJ_INFO pi ON pi.PROJECTNO = PSI.PROJECTNO
WHERE
FMA.STATUS = 1
AND (SU.LOGINNAME = 'XXX' OR PI.PROJECT_MANAGER_ID = '08BA5F8B2CC4FC29E05010ACB550646D' )
ORDER BY
FMA.CREATE_DATE DESC
欢迎关注公众号算法小生