【发布时间】:2014-04-24 21:19:53
【问题描述】:
我正在开发一个设备库存应用程序。这件设备是我的顶级设备,它包含组件、子组件和零件。我正在尝试使用递归 CTE 来显示父/子关系。我遇到的问题是某些组件可以有多个相同的子组件,这意味着零件编号没有差异。这导致我的查询无法根据我的 order by 语句显示正确的关系。这是我第一次使用 CTE,所以我在网上学到了很多东西。
PartNumberID 174 在此程序集中使用了两次。
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 语句的这 2 个程序集没有任何独特之处。
代码:
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 以进行订购但没有成功?”
-
当然,我试图在创建“parts”(cte-Name)数据时动态创建顺序 ID,以便我有一个可以订购的唯一字段。我认为这将允许多个相同的子组件。蒂姆
标签: tsql