【SQL】记录一下今天遇到的问题和解决方法
需求:上一篇sql查询的结果中,有些单位是不需要展示的,单位数据表里有个字段为是否启用,当这个单位禁用了,该单位以及子单位都不能展示出来。
表结构如下,需要用oracle递归查询禁用的单位以及子单位。
解决办法:
select * from TOP_ORGANIZATION
start with STATE = '2'
CONNECT BY PRIOR ORG_ID = PARENT_ORG_ID
原文链接:https://www.cnblogs.com/Soprano/p/10659127.html
补充:2020年1月7日10:23:08
1 背景:现有设备分类表和作业标准两张表,每个设备分类下可能一个作业标准,即作业标准表有个字段指向设备分类表主键ID。
2 原需求:设备分类树显示的时候,如果该分类下有作业标准,则展示一个图标。
3 新需求:设备分类树节点本身有标准的,子节点有标准的,本身和子节点都有标准的,要显示不同的图片标识。
4 成果图:
5 难点:因为分类树数据量多,所以要在一个SQL中查询所有节点和子节点信息,如果每个节点单独去查效率低,响应时间过长。
6 解决方案:查询结果作为条件查询的参数(第五行的AA.ID是第一行的查询结果),子查询用递归查出下级的标准数量
SELECT AA.*, NVL(BB.COUNT, 0) COUNT, AA.ID CID,
(SELECT COUNT(*) FROM DM_CLASSIFY C
LEFT JOIN LIB_COMMON_WORK_STANDARD S ON S.CLASSIFY_ID = C.ID
WHERE S.CLASSIFY_ID IS NOT NULL
START WITH C.PARENT_CLASSIFY_ID = AA.ID
CONNECT BY PRIOR C.ID = C.PARENT_CLASSIFY_ID) CCOUNT
FROM (
SELECT ex.TYPE, ex.MIN_UNIT_FLAG, ex.SPECIALITY, ex.NAME_RULE, dm.*
FROM DM_CLASSIFY dm
LEFT JOIN DM_CLASSIFY_EXTEND ex ON dm.id = ex.id
ORDER BY dm.SORT_NO ASC
) AA
LEFT JOIN (
SELECT COUNT(1) COUNT, S.CLASSIFY_ID CID
FROM DM_CLASSIFY C
LEFT JOIN LIB_COMMON_WORK_STANDARD S ON S.CLASSIFY_ID = C.ID
WHERE S.STATUS != 'DELETED' AND S.STATUS != 'PUBLISH_APPROVE' AND S.STATUS != 'ABANDON_APPROVE'
GROUP BY CLASSIFY_ID
) BB ON AA.ID = BB.CID