我有一个表格,其中的产品具有等级关系 - 例如,有一排苹果包含5公斤苹果,一排儿童排有1公斤苹果。这种关系如下:
Id ContainsId Name
8792 4567 Bag - 5kg apples
4567 NULL 1 kg apples
我需要的是对每个分层系列中的产品进行分组,以便我可以将它们显示在彼此相邻的列表中。结果应如下所示:
FamilyId Id Name
8792 8792 Bag - 5kg apples
8792 4567 1kg apples
这个家庭可以有两个以上的成员。
你能帮我吗?
答案 0 :(得分:0)
使用递归CTE可以这样做
DECLARE @tbl TABLE (Id INT, ContainsId INT, [Name] NVARCHAR(100))
INSERT INTO @tbl
(Id, ContainsId, [Name])
VALUES
(8792,4567,'Bag - 5kg apples')
,(4567,5555,'1 kg apples')
,(5555,7878,'Some Oranges') --Added some extra items
,(7878,NULL,'Fish Fingers') --Added some extra items
;WITH cteX
AS
( SELECT
T.Id, T.ContainsId, T.[Name], FamilyId = T.Id
FROM
@tbl T
WHERE
T.Id = 8792
UNION ALL
SELECT
T1.Id
, T1.ContainsId
, T1.[Name]
, R.FamilyId
FROM
@tbl T1
INNER JOIN
cteX R ON R.ContainsId = T1.Id
)
SELECT T.FamilyId
, T.Id
, T.Name
FROM cteX T
输出
FamilyId Id Name
8792 8792 Bag - 5kg apples
8792 4567 1 kg apples
8792 5555 Some Oranges
8792 7878 Fish Fingers