我有一张表,其中存在父/子关系,其中每个孩子的ExternalCategoryCode
列数据需要连接到父级中ExternalCategoryCode
.
以下是一些已损坏的示例数据,其中父记录 (Id=96)ExternalCategoryCode
is NULL。该关系是通过ParentId
field:
Id |Name |ExternalCategoryCode|ParentId
---|------------------------------|--------------------|---------
96 | Health & Personal Development| NULL | NULL
---|------------------------------|--------------------|---------
97 | Health | H1*;H2* | 96
---|------------------------------|--------------------|---------
98 | Personal Development | P1;P2;P3* | 96
---|------------------------------|--------------------|---------
99 | Other Health | OH* | 96
---|------------------------------|--------------------|---------
数据应如下所示:
Id |Name |ExternalCategoryCode |ParentId
---|------------------------------|----------------------|---------
96 | Health & Personal Development| H1*;H2*;P1;P2;P3*;OH*| NULL
---|------------------------------|----------------------|---------
97 | Health | H1*;H2* | 96
---|------------------------------|----------------------|---------
98 | Personal Development | P1;P2;P3* | 96
---|------------------------------|----------------------|---------
99 | Other Health | OH* | 96
---|------------------------------|----------------------|---------
EDITs:
- 后代级别可以是任意深度的级别,但是最深的子级别
后代需要更新到主要父级
ExternalCategoryCode
。取下面最后两条记录(Id=100
and Id=101)都链接到ParentId
97.因为Id=97
ParentId
不为空,我们应该继续沿着树向上直到我们
查找一条记录ParentId
NULL(最顶层父级)。
- 另一个问题是关于最上层的父母是否可以
ExternalCategoryCode
包含重复项?下面的示例显示了 M2* 两次。这很好,因为我们的业务逻辑类库如果发现任何重复项,就会过滤掉它。
-
如果记录中包含链接ParentId
(即是一个孩子)but有一个 NULLExternalCategoryCode
,这些代码可以忽略。
Id |Name |ExternalCategoryCode |ParentId
---|------------------------------|----------------------|---------
96 | Health & Personal Development| H1*;H2*;P1;P2;P3*;OH*| NULL
| | |
| | M1;M2*; M2*;M3* |
---|------------------------------|----------------------|---------
97 | Health | H1*;H2* | 96
---|------------------------------|----------------------|---------
98 | Personal Development | P1;P2;P3* | 96
---|------------------------------|----------------------|---------
99 | Other Health | OH* | 96
---|------------------------------|----------------------|---------
100| Medicine | M1;M2* | 97
---|------------------------------|----------------------|---------
101| Other Medicine | M2*;M3* | 97
---|------------------------------|----------------------|---------
102| Other Medicine 2 | NULL | 97
---|------------------------------|----------------------|---------
表中还有其他父/子损坏。我如何能:
将此脚本写入有问题的表并连接
家长记录ExternalCategoryCode
带着孩子ExternalCategoryCode
data?
-
列出已更新的父记录。通常使用时UPDATED
,这只是显示了这样的内容,我想报告一下:
(受影响的 1 行)
使用中的技术:
SQL DEMO http://rextester.com/QAN56368首先连接来自同一父级的所有代码,然后更新。
WITH superParent as (
SELECT [Id], [Id] as [topParent], [Name], [ExternalCategoryCode], [ParentId]
FROM Table1 t
WHERE [ParentId] is NULL
UNION ALL
SELECT t.[Id], sp.[topParent], t.[Name], t.[ExternalCategoryCode], t.[ParentId]
FROM Table1 t
JOIN superParent sp
ON sp.[id] = t.[ParentId]
),
combine as (
Select distinct ST2.[topParent],
(
Select ST1.[ExternalCategoryCode] + ';' AS [text()]
From superParent ST1
Where ST1.[topParent] = ST2.[topParent]
ORDER BY ST1.[Id]
For XML PATH ('')
) [External]
From superParent ST2
WHERE ST2.[ParentId] IS NOT NULL
)
UPDATE T
SET T.[ExternalCategoryCode] = C.[External]
FROM Table1 T
JOIN combine C
ON T.[Id] = c.[topParent];
SELECT *
FROM Table1;
OUTPUT使用递归 cte 将顶级父级分配给每个子级。然后使用 XML PATH 连接所有CategoryCode
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)