使用递归自连接“修复”根PK

问题描述 投票:0回答:1

取以下虚构的网站数据(0表示缺失值):

USER_ID TRANSACTION_ID_PARENT TRANSACTION_ID_CHILD
1 0 1
1 1 2
1 2 3
1 0 11
1 11 12

如何添加“修复”/生成根主键的列:

USER_ID TRANSACTION_ID_PARENT TRANSACTION_ID_CHILD TRANSACTION_ID_ROOT
1 0 1 1
1 1 2 1
1 2 3 1
1 0 11 11
1 11 12 11

我的预感是按 USER_ID 分组的递归 CTE?如何在 IBM db2 方言中实现这一点?

也许递归自连接有更优雅的数据库特定变体?

sql db2
1个回答
1
投票

可以这样做:

with table1 (USER_ID, TRANSACTION_ID_PARENT, TRANSACTION_ID_CHILD) as (
  VALUES
  (1, 0, 1),
  (1, 1, 2),
  (1, 2, 3),
  (1, 0, 11),
  (1, 11, 12)
),
rec (USER_ID, TRANSACTION_ID_PARENT, TRANSACTION_ID_CHILD, TRANSACTION_ID_ROOT) as (
  select USER_ID, TRANSACTION_ID_PARENT, TRANSACTION_ID_CHILD, TRANSACTION_ID_CHILD
  from table1 where TRANSACTION_ID_PARENT= 0
  union all
  select rec.USER_ID, table1.TRANSACTION_ID_PARENT, table1.TRANSACTION_ID_CHILD, rec.TRANSACTION_ID_ROOT
  from rec, table1 where (rec.user_id, rec.TRANSACTION_ID_CHILD) = (table1.USER_ID, table1.TRANSACTION_ID_PARENT)
)
select * from rec
order by USER_ID, TRANSACTION_ID_ROOT, TRANSACTION_ID_PARENT, TRANSACTION_ID_CHILD
USER_ID TRANSACTION_ID_PARENT TRANSACTION_ID_CHILD TRANSACTION_ID_ROOT
1 0 1 1
1 1 2 1
1 2 3 1
1 0 11 11
1 11 12 11

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.