【发布时间】:2016-10-19 05:51:07
【问题描述】:
我有一个名为 WarehouseStore.dws6.BeScheduleItem 的表。 下面是在 WarehouseStore.dws6.BeScheduleItem 中找到的数据的屏幕截图。 WarehouseStore.dws6.BeScheduleItem
我的要求是根据以下条件从 WarehouseStore.dws6.BeScheduleItem 表中找到缺失的节点。
将所有 isMissing 设置为 0
如果子字段具有 IcpUid 字段不为 NULL 并且 父级具有 IcpUid 字段 NULL 然后将子父级 IsMissing 设置为 1。
如果子字段具有 IcpUid 字段 NULL 并且 父级具有 IcpUid 字段 NULL 并且父级子级具有 IsMissing 等于 1 然后将子父级 IsMissing 设置为 1。
重复第 3 步,直到没有更多内容需要更新。
我能够在我的 SQL 代码中满足步骤 1 到 3,但没有满足步骤 4,因为我需要执行一个 for 循环来检查是否没有更多更新。 下面是我的 SQL 代码
DECLARE @TEMP TABLE (
Code NVARCHAR(MAX) NOT NULL,
Name NVARCHAR(MAX) NULL,
Level INT NULL,
IsMissing BIT NULL,
ParentCode NVARCHAR(MAX) NULL,
IcpUid NVARCHAR(MAX) NULL
);
INSERT INTO @TEMP(
Code,
Name,
Level,
IsMissing ,
ParentCode ,
IcpUid
)
SELECT
Code,
Name,
Level,
IsMissing = 0,
ParentCode,
IcpUid
FROM WarehouseStore.dws6.BeScheduleItem
WHERE IsDeleted = 0
;
UPDATE P SET IsMissing = 1
FROM @TEMP C
INNER JOIN @TEMP P ON P.Code = C.ParentCode
WHERE C.IcpUid IS NOT NULL
AND P.IcpUid IS NULL
;
SELECT
P.Code,
P.Name,
P.Level,
C.IsMissing ,
C.ParentCode ,
P.IcpUid
FROM @TEMP P
INNER JOIN @TEMP C ON P.Code = C.ParentCode
WHERE C.IsMissing = 1
AND C.IcpUid IS NULL
AND P.IcpUid IS NULL
ORDER BY LEVEL
您能否建议我如何从上述代码构建递归循环。 请注意:需要循环第 3 步,当前数据可能不需要它,但我们正在针对所有情况进行编码,而不仅仅是当前数据
【问题讨论】:
标签: sql-server recursion business-intelligence