SQL 具有条件结果的 DB2 递归查询
SQL DB2 recursive query with conditional results
我正在与一个 table X 一起工作,其中包含一组人,每组包含两类事物:人和其他组(子组)。子组本身包含其他子组和其他人...等...
Table X 包含定向 links,表示为四列:(* 表示主索引)
- Parent_id (*) = parent 组的 ID(不唯一)
- Child_id (*) = child 的 ID(子组或人员 ID)(不唯一)
- Link_id (*) = link 的 ID(不唯一)
- ChildType = child(组或人)的类型
例如:
Parent_id Child_id Link_id 子类型
001 002 201组
001 101 202 人
001 102 203 人
002 003 204组
002 004 205组
002 103 206 人
003 104 207 人
004 105 208 人
我的 objective 是检索以下列中的完整树数据:
- Parent_id
- Child_id
- Link_id
- 儿童类型
Parent_id parent 组的 - id(当 Parent_id 不是根时(如果 Parent_id 是根则为零)
- id of link from parent group of Parent_id to parent_id
例如
001002201组000000
001 101 202 人 000 000
001 102 203 人 000 000
002003204组001 201
002004205组001 201
002 103 206 人 001 201
003 104 207 人 002 204
004 105 208 人 002 205
但是我找不到保存 parent_id 的 parent 组中的数据并将其与 link 编辑到当前 paren_id 的内容一起保存的解决方案。
*** 编辑 2020-08-21:添加了当前解决方案 ***
我当前的解决方案通过递归 CTE 查询获取除了这两个滞后数据之外的所有数据:
WITH TTEMP (
, Parent_id
, Child_id
, Link_id
, ChildType
) AS
(
SELECT
, Parent_id
, Child_id
, Link_id
, 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
有什么建议吗?
提前致谢。
以下查询returns您提供的结果。
WITH
links_TABLE (Parent_id, Child_id, Link_id, ChildType) AS
(
VALUES
('001', '002', '201', 'Group')
, ('001', '101', '202', 'People')
, ('001', '102', '203', 'People')
, ('002', '003', '204', 'Group')
, ('002', '004', '205', 'Group')
, ('002', '103', '206', 'People')
, ('003', '104', '207', 'People')
, ('004', '105', '208', 'People')
)
, TTEMP (Parent_id, Child_id, Link_id, ChildType, Parent_id_Parent, Link_id_Parent) AS
(
SELECT Parent_id, Child_id, Link_id, ChildType, '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 link.
我正在与一个 table X 一起工作,其中包含一组人,每组包含两类事物:人和其他组(子组)。子组本身包含其他子组和其他人...等...
Table X 包含定向 links,表示为四列:(* 表示主索引)
- Parent_id (*) = parent 组的 ID(不唯一)
- Child_id (*) = child 的 ID(子组或人员 ID)(不唯一)
- Link_id (*) = link 的 ID(不唯一)
- ChildType = child(组或人)的类型
例如:
Parent_id Child_id Link_id 子类型
001 002 201组
001 101 202 人
001 102 203 人
002 003 204组
002 004 205组
002 103 206 人
003 104 207 人
004 105 208 人
我的 objective 是检索以下列中的完整树数据:
- Parent_id
- Child_id
- Link_id
- 儿童类型 Parent_id parent 组的
- id(当 Parent_id 不是根时(如果 Parent_id 是根则为零)
- id of link from parent group of Parent_id to parent_id
例如
001002201组000000
001 101 202 人 000 000
001 102 203 人 000 000
002003204组001 201
002004205组001 201
002 103 206 人 001 201
003 104 207 人 002 204
004 105 208 人 002 205
但是我找不到保存 parent_id 的 parent 组中的数据并将其与 link 编辑到当前 paren_id 的内容一起保存的解决方案。
*** 编辑 2020-08-21:添加了当前解决方案 ***
我当前的解决方案通过递归 CTE 查询获取除了这两个滞后数据之外的所有数据:
WITH TTEMP (
, Parent_id
, Child_id
, Link_id
, ChildType
) AS
(
SELECT
, Parent_id
, Child_id
, Link_id
, 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
有什么建议吗?
提前致谢。
以下查询returns您提供的结果。
WITH
links_TABLE (Parent_id, Child_id, Link_id, ChildType) AS
(
VALUES
('001', '002', '201', 'Group')
, ('001', '101', '202', 'People')
, ('001', '102', '203', 'People')
, ('002', '003', '204', 'Group')
, ('002', '004', '205', 'Group')
, ('002', '103', '206', 'People')
, ('003', '104', '207', 'People')
, ('004', '105', '208', 'People')
)
, TTEMP (Parent_id, Child_id, Link_id, ChildType, Parent_id_Parent, Link_id_Parent) AS
(
SELECT Parent_id, Child_id, Link_id, ChildType, '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 link.