【问题标题】:SQL DB2 recursive query with conditional results带有条件结果的 SQL DB2 递归查询
【发布时间】:2020-12-10 06:30:40
【问题描述】:

我正在处理一个包含一组人的表 X,每个组包含两种类型的东西:人和其他组(子组)。子组本身包含其他子组和其他人......等等......

表 X 包含表示为四列的定向链接:(* 表示主索引)

  • Parent_id (*) = 父组的 id(不唯一)
  • Child_id (*) = 孩子的 id(子组或人的 id)(不是唯一的)
  • Link_id (*) = 链接的 ID(不唯一)
  • ChildType = 孩子的类型(组或人)

例如:

Parent_id Child_id Link_id ChildType

001 002 201 集团

001 101 202 人

001 102 203 人

002 003 204 集团

002 004 205 集团

002 103 206 人

003 104 207 人

004 105 208 人

我的目标是在以下列中检索完整的树数据:

  • Parent_id
  • Child_id
  • Link_id
  • 子类型
  • Parent_id 的父组的id(当Parent_id 不是root 时(如果Parent_id 是root 则为零)
  • 从Parent_id的父组到parent_id的链接id

例如

001 002 201 组 000 000

001 101 202 人 000 000

001 102 203 人 000 000

002 003 204001 201

002 004 205001 201

002 103 206 人 001 201

003 104 207 人 002 204

004 105 208 人 002 205

但是我找不到解决方案来保存 parent_id 的父组中的数据,并将其与链接到当前 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

有什么建议吗?

提前致谢。

【问题讨论】:

  • 发布您当前的解决方案,以便可以使用它来扩展它。哪个 Db2 版本和平台?
  • @data_henrik:完成。我目前使用的是 db2 v11。

标签: sql db2 hierarchical-data recursive-query


【解决方案1】:

以下查询返回您提供的结果。

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 链接。

【讨论】:

  • 我认为它完全回答了我的问题。谢谢你。其实这很明显!
猜你喜欢
  • 2016-06-24
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多