簡體   English   中英

遞歸自引用表到平面結構

[英]Recursive self referenced table to flat structure

Entity
---------
ID
TypeAID
TypeBID

TypeAIDTypeBID是可為空的字段,其中行可以輸入一個、兩個或一個值,並且兩個IDs都指向同一個表Entity.ID (自引用)。

有沒有辦法通過 3 級深度結構遞歸 go 並獲得parent -> childparent -> grandchildchild -> grandchild關系的平面結構?

這是第一個表是普通層次結構的示例,第二個是所需的平面 output。

使用 CTE:

DECLARE @t TABLE (Id CHAR(1), TypeAId CHAR(1), TypeBId CHAR(1))

INSERT INTO @t VALUES
    ('A', NULL, NULL),
    ('B', NULL, NULL),
    ('C', 'A', NULL),
    ('D', 'B', 'C'),
    ('E', NULL, 'C')

-- All entities flattened
;WITH l1 AS (
    SELECT t.TypeAId AS Parent, t.Id AS Child
    FROM @t t
    WHERE t.TypeAId IS NOT NULL
    UNION
    SELECT t.TypeBId AS Parent, t.Id AS Child
    FROM @t t
    WHERE t.TypeBId IS NOT NULL)

-- Join l1 with itself
,l2 AS (
    SELECT l1.Parent, l2.Child
    FROM l1 l1
    INNER JOIN l1 l2 ON l2.Parent = l1.Child)

SELECT * FROM l1
UNION ALL SELECT * FROM l2
ORDER BY Parent

以下內容適用於任意數量的級別:

DECLARE @t table
(
    ID char(1)
    , TypeAID char(1)
    , TypeBID char(1)
)

INSERT INTO @t (ID, TypeAID, TypeBID)
VALUES
('A', NULL, NULL)
, ('B', NULL, NULL)
, ('C', 'A', NULL)
, ('D', 'B', 'C')
, ('E', NULL, 'C')
;

WITH cte
AS
(
    SELECT
        Parent
        , ID Child
    FROM
        (
            SELECT
                ID
                , TypeAID
                , TypeBID
            FROM @t
        ) D
        UNPIVOT
        (
            Parent FOR TypeID IN (
                [TypeAID]
                , [TypeBID]
            )
        ) U
)
,

cte2
AS
(
    SELECT
        Parent
        , Child
    FROM cte

    UNION ALL

    SELECT
        cte1.Parent
        , cte2.Child
    FROM
        cte2 cte1
        JOIN cte cte2 ON cte1.Child = cte2.Parent
)

SELECT
    Parent
    , Child
FROM cte2
ORDER BY
    Parent
    , Child

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM