在SQL Server 2016中,我有一个具有以下链接结构的表:
dbo.项目
| 原始项目|项目ID|
| - ------|- ------|
| 零|七|
| 1个|第二章|
| 零|1个|
| 五个|六个|
| 三个|四个|
| 零|五个|
| 第二章|三个|
重要的是,这个例子是真实的数据的一个平凡化版本,而整齐的升序条目并不存在于真实数据中,我这样做只是为了简化理解。
我构造了一个查询来获取我称为TerminalItemID的内容,在本例中为ItemID 4
、6
和7
,并将其填充到临时表**@TerminalItems**中,其结果集如下所示:
@油库项目
| 终端项目ID|
| - ------|
| 四个|
| 六个|
| 七|
我需要的是一个最终的 mapping 表,它看起来像这样(使用上面的例子--注意,它还包含4
、6
和7
到它们自身的Map,这是业务逻辑所需要的):
@Map
| 项目ID|终端项目ID|
| - ------|- ------|
| 1个|四个|
| 第二章|四个|
| 三个|四个|
| 四个|四个|
| 五个|六个|
| 六个|六个|
| 七|七|
我需要帮助的是如何建立这个最后的**@Map**表。任何在这个方向的援助是非常感谢!
3条答案
按热度按时间eyh26e7m1#
这应该做到:
注意MAXRECURSION设置;默认情况下,SQLServer迭代递归100次;这意味着你的树的深度可以是100,max(终端项目和它的最终原始项目之间的最大节点数)。这可以增加
OPTION(MAXRECURSION nnn)
,其中nnn可以根据需要调整。它也可以通过使用0
完全删除,但不推荐这样做,因为你的数据可能会导致无限循环。oymdgrw72#
可以使用递归CTE计算序列中的最后一项。例如:
结果:
请参见db<>fiddle中的运行示例。
czfnxgou3#
这是一个典型的间隙和岛问题,也可以在不递归的情况下分三步执行:
检查here演示。
假设:您的端子ID项目对应于NULL“OriginalItem”值前面的“ItemID”值。