分层查询,使用缺失子值的父值

时间:2018-03-07 14:53:04

标签: sql sql-server hierarchical-data

我有以下数据集:

id  parentId    entityId    isAllowed
45  NULL        1           0
46  45          2           1
46  45          3           1
47  46          3           0
47  46          4           0

对于每个id,我想获取所有实体的值,无论是直接还是继承。所以对于每个实体:

  • 如果孩子有直接价值,请使用它。
  • 如果孩子没有直接价值,则应使用其父母的价值(如果存在)。
  • 如果孩子及其父母没有价值,请不要显示。

'isAllowed'值应该是最新的孩子。

结果应该是这样的:

id  entityId    isAllowed
45  1           0
46  1           0
47  1           0
46  2           1
47  2           1
46  3           1
47  3           0
47  4           0

请注意,对于实体1,id的45-47具有相同的值(继承46-47)。对于实体3,45没有值(因为没有直接值而没有继承值),而46和47都有它们的直接值。

我设法使用以下查询实现'isAllowed'部分:

WITH p AS (
 SELECT id, 
        parentId, 
        entityId,
        isAllowed
    FROM t1
    WHERE parentId IS NULL

    UNION ALL

    SELECT t1.id,
           t1.parentId,
           t1.entityId,
           COALESCE(t1.isAllowed, p.isAllowed)
    FROM t1
    INNER JOIN p ON p.id = t1.parentId)

SELECT * FROM p

知道怎么查询吗?谢谢!

0 个答案:

没有答案