问题描述
我正在处理包含人员组的表X,每个组包含两种类型的事物:人员和其他组(子组)。子群本身包含其他子群和其他人...等等...
表X包含以四列表示的定向链接:(*表示主索引)
- Parent_id(*)=父组的ID(不唯一)
- Child_id(*)=孩子的ID(子组或人的ID)(不是唯一的)
- Link_id(*)=链接ID(不唯一)
- ChildType =孩子的类型(组或人)
例如:
Parent_id Child_id Link_id ChildType
001002201组
001101202人
001102203人
002003204组
002004205组
002103206人
003104207人
004105208人
我的目标是在以下几列中检索完整的树数据:
- Parent_id
- Child_id
- Link_id
- ChildType
- Parent_id父组的ID(当Parent_id不是root时(如果Parent_id是root则为零)
- 从Parent_id的父组到parent_id的链接的ID
例如
001 002 201 组000 000
001101202人数000 000
001102203人000 000
002 003 204 组 001 201
002 004 205 组 001201
002103206人员 001201
003 104 207人员 002 204
004 105208人们 002205
但是,我找不到用于保存来自parent_id父组的数据并将其与链接到当前paren_id的事物一起保存的解决方案。
***编辑2020-08-21:添加了当前解决方案***
我当前的解决方案通过查询递归CTE来获取除这两个滞后数据以外的所有数据:
WITH TTEMP (
,Parent_id
,Child_id
,Link_id
,ChildType
) AS
(
SELECT
,ChildType
FROM links_TABLE
WHERE Parent_id = :query_group_id
UNION ALL
SELECT
L.Parent_id
,L.Child_id
,L.Link_id
,L.ChildType
FROM TTEMP AS T
,links_TABLE AS L
WHERE T.Child_id = L.Parent_id
AND T.ChildType = 'Group'
)
SELECT
Parent_id
,Child_id
,Link_id
,ChildType
FROM TTEMP
FOR FETCH ONLY
有什么建议吗?
谢谢。
解决方法
以下查询返回您提供的结果。
WITH
links_TABLE (Parent_id,Child_id,Link_id,ChildType) AS
(
VALUES
('001','002','201','Group'),('001','101','202','People'),'102','203',('002','003','204','004','205','103','206',('003','104','207',('004','105','208','People')
),TTEMP (Parent_id,ChildType,Parent_id_Parent,Link_id_Parent) AS
(
SELECT Parent_id,'000' Parent_id_Parent,'000' Link_id_Parent
FROM links_TABLE C
WHERE NOT EXISTS (SELECT 1 FROM links_TABLE P WHERE P.CHILD_ID = C.PARENT_ID)
UNION ALL
SELECT X.Parent_id,X.Child_id,X.Link_id,X.ChildType,P.Parent_id,P.Link_id
FROM TTEMP P,links_TABLE X
WHERE X.Parent_id = P.Child_id
)
SELECT *
FROM TTEMP;
db<>fiddle链接。