【发布时间】:2016-12-07 00:22:21
【问题描述】:
我有一个表,其中存在父/子关系,其中每个孩子的ExternalCategoryCode 列数据需要连接到父母ExternalCategoryCode。
这是一些损坏的示例数据,其中父记录 (Id=96)
ExternalCategoryCode 是 NULL。关系是通过ParentId 字段:
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
---|------------------------------|----------------------|---------
编辑:
- 后代层可以是任何深度,但深度子级
后代需要更新到主要父母的
ExternalCategoryCode。取下面的最后两条记录 (Id=100 和 Id=101) 都链接到ParentId97。因为 Id=97ParentIdIS NOT NULL,我们应该继续向上树,直到我们 查找ParentId为 NULL 的记录(最高父级)。 - 另一个问题是关于最高父级的
ExternalCategoryCode是否包含重复项?下面的示例显示了 M2* 两次。这很好,因为我们的业务逻辑类库会在找到重复项时过滤掉。 -
如果记录在其
ParentId中有链接(即是子项)但 有一个 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数据?-
列出更新的父记录。通常在使用
UPDATED时,这只是显示这样的内容,我想报告这个:(受影响的 1 行)
我正在使用的技术:
- SQL 服务器
【问题讨论】:
-
后代层有多深?例如,97 是 96 的子代。那么会有一个 101 是 97 的子代吗?另外,会不会有两个child的code相同的情况(比如H1),那么parent中的code是否需要减少这个重复?
-
@DVT 我将用这些答案编辑问题。
-
已添加编辑帖子。
-
所以你只想更新最顶层的父级,而不是中间级别的?
-
没错 - 我们使用最顶层的父级作为“包罗万象”的分组目的。无论出于何种原因,我发现我们的一些父母没有所有的孩子(以及他们的孩子等)代码。
标签: sql sql-server parent-child