[英]Recursive self referenced table to flat structure
使用 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.