Tsql 具有多个有效的相同父子关系的递归CTE
我有一个设备清单应用程序,我正在工作。这件设备是我的顶层,它包含组件、子组件和零件。我试图使用递归CTE来显示父/子关系。我遇到的问题是,一些组件可以有多个相同的子组件,这意味着零件号没有差异。这导致我的查询无法根据order by语句显示正确的关系。这是我第一次使用CTE,所以我在网上学到了很多东西 零件号174在此部件中使用了两次Tsql 具有多个有效的相同父子关系的递归CTE,tsql,Tsql,我有一个设备清单应用程序,我正在工作。这件设备是我的顶层,它包含组件、子组件和零件。我试图使用递归CTE来显示父/子关系。我遇到的问题是,一些组件可以有多个相同的子组件,这意味着零件号没有差异。这导致我的查询无法根据order by语句显示正确的关系。这是我第一次使用CTE,所以我在网上学到了很多东西 零件号174在此部件中使用了两次 Sample Table equipmentID parentPartNumberID partNumberID 17
Sample Table
equipmentID parentPartNumberID partNumberID
17 1 281
17 281 156
17 156 161
17 161 224
17 281 174
17 174 192
17 192 56
17 174 193
17 281 174
17 174 192
17 192 56
17 174 193
17 281 283
17 ` 283 183
17 283 277
17 283 173
Results of Query
PARENT CHILD PARTLEVEL HIERARCHY
1 281 0 281
281 156 1 281.156
156 161 2 281.156.161
161 224 3 281.156.161.224
281 174 1 281.174
281 174 1 281.174
174 192 2 281.174.192
174 192 2 281.174.192
192 56 3 281.174.192.56
192 56 3 281.174.192.56
174 193 2 281.174.193
174 193 2 281.174.193
281 283 1 281.283
283 173 2 281.283.173
283 183 2 281.283.183
283 277 2 281.283.277
如您所见,层次结构创建正确,但没有正确返回,因为order by语句的这两个程序集没有唯一性
守则:
with parts(PARENT,CHILD,PARTLEVEL,HIERARCHY) as (select parentPartNumberID,
--- Used to get rid of duplicates
CASE WHEN ROW_NUMBER() OVER (PARTITION BY partNumberID ORDER BY partNumberID) > 1
THEN NULL
ELSE partNumberID END AS partNumberID,
0,
CAST( partNumberID as nvarchar) as PARTLEVEL
FROM db.tbl_ELEMENTS
WHERE parentPartNumberID=1 and equiptmentID=17
UNION ALL
SELECT part1.parentPartNumberId,
--- Used to get rid of duplicates
CASE WHEN ROW_NUMBER() OVER (PARTITION BY parts1.partNumberID ORDER BY parts1.partNumberID) > 1
THEN 10000 + parts1.partNumberID
ELSE parts1.partNumberID END,
PARTLEVEL+1,
cast(parts.hierarchy + '.' + CAST(parts1.partNumberID as nvarchar) as nvarchar)
from dbo.tbl_BOM_Elements as parts1 inner
join parts onparts1.parentPartNumberID=parts.CHILD
where id =17)
select CASE WHEN PARENT > 10000
THEN PARENT - 10000
ELSE PARENT END AS PARENT,
CASE WHEN CHILD > 10000
THEN CHILD - 10000
ELSE CHILD END AS CHILD,
PARTLEVEL,HIERARCHY
from parts
order by hierarchy
我试图为订单创建一个唯一的ID,但没有成功。如果您有任何建议,我将不胜感激。我将首先回答有关获取顺序id的部分 如果您有控制权,则可以为源表提供唯一的Id。在这里使用代理主键是非常典型的 您可以改为在递归CTE之前使用第二个CTE,并使用row_NUMBER()OVER BY(ORDER BY equipmentID、parentPartNumberID、partNumberID)在那里添加行号。然后根据该表而不是直接从源表构建递归CTE
更好的方法是使用第一个CTE按设备ID、parentPartNumberID、partNumberID分组,并添加计数(1)字段。这将允许您在层次结构中使用计数,而不是获取重复项。类似于281.283.277x2之类的东西。您能详细解释一下“我试图创建一个唯一的订单ID,但没有成功?”当然,我试图在创建“零件”(cte名称)数据时动态创建一个顺序ID,这样我就有了一个唯一的字段,可以根据该字段进行订单。我认为这将允许多个相同的子组件。谢谢,在更改源表之前,我将尝试您的建议。我觉得换桌子可能是最简单的方法。。。由于数据不多,TimI最终更改了我的源表。然后我根据新的唯一id进行订购,并获得所需的视图。对我来说,这是最简单的解决办法。卡尔:谢谢你的帮助