实际业务中经常会使用到无限级分类,当我们需要根据一个指定分类推算出它下面的所有子级,包括子级的子级等,或者推算出所有父级,包括父级的父级等,我一般是通过后端代码来递归推算。其实也可以通过SQL语句来实现,免去写递归代码。不多废话,上SQL。
一、推算所有父级
with cte_parent(Id,Name,ParentId)
as
(
select Id,Name,ParentId from DeviceTree where Id= '{groupid}'
union all
select a.Id,a.Name,a.ParentId from DeviceTree as a inner join cte_parent as b
on a.Id=b.ParentId where a.ParentId!='00000000-0000-0000-0000-000000000000' and a.isdelete=0
)
select Id,Name from cte_parent;
二、推算所有子级
with cte_child(Id,Name,ParentId)
as
(
select Id,Name,ParentId from DeviceTree where Id = '{groupid}'
union all
select a.Id,a.Name,a.ParentId from DeviceTree a
inner join cte_child b on ( a.ParentId=b.Id) where a.isdelete=0
)
select Id,Name from cte_child;
以上代码未做性能测试,仅供参考。
实际业务中经常会使用到无限级分类,当我们需要根据一个指定分类推算出它下面的所有子级,包括子级的子级等,或者推算出所有父级,包括父级的父级等,我一般是通过后端代码来递归推算。其实也可以通过SQL语句来实现,免去写递归代码。不多废话,上SQL。一、推算所有父级with cte_parent(Id,Name,ParentId) ...
(--下级
父
项
select materialshelf_id,materialshelf_pid,materialshelf_name from materialshelf where materialshelf_id = 5 --
子
级id
union all
--
递
归结果
CREATE TABLE [dbo].[yq_Project](
[ID] [int] IDENTITY(1,1) primary key,
[cCode] [varchar](32) NOT NULL,
[cPriorCode] [varchar](32) NULL,...
@r AS _id,
(SELECT @r := parent_id FROM folder WHERE id = _id) AS parent_id,
@l := @l + 1 AS lvl
组织之间存在层级关系,人员可对应多个组织,对应的多个组织也可以存在上下级关系。
查询
某个人的组织的时候,需要把这个人对应的所有组织,和对应的每一个组织的所有上级都按序
查询
出来。
PersonListDto
public class PersonListDTO {
private Long id;
private String personCode;
private String name;
private String position;
department_id = '123456789' 是需要
查询
上级部门的表ID字段名称 name 和 value
parent_id 是表内存储的department_id数据对应的
父
级ID
WITH RECURSIVE cte AS(
SELECT
department x
WHERE
x.department_id = '123456789'
UNION
ALL ..