取以下虚构的网站数据(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 方言中实现这一点?
也许递归自连接有更优雅的数据库特定变体?
可以这样做:
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 |