我有一个带有下表的 SQL Server 2016:
CREATE TABLE [dbo].[Code] (
[CodeId] INT IDENTITY (1, 1) NOT NULL,
[Serial] VARCHAR(20) NOT NULL,
[AggregationLevelId] TINYINT NOT NULL,
[CommissioningFlag] TINYINT NOT NULL,
[ ... ]
CONSTRAINT [PK_CODE] PRIMARY KEY CLUSTERED ([CodeId] ASC),
CONSTRAINT [UC_CODE_SERIAL] UNIQUE NONCLUSTERED ([Serial] ASC),
CONSTRAINT [FK_Code_AggregationLevelConfiguration]
FOREIGN KEY ([AggregationLevelId])
REFERENCES [dbo].[AggregationLevelConfiguration] ([AggregationLevelConfigurationId])
)
CREATE TABLE [dbo].[Aggregation] (
[AggregationId] INT NOT NULL,
CONSTRAINT [PK_AGGREGATIONS] PRIMARY KEY CLUSTERED ([AggregationId] ASC),
CONSTRAINT [FK_Aggregation_Code]
FOREIGN KEY ([AggregationId])
REFERENCES [dbo].[Code] ([CodeId])
)
CREATE TABLE [dbo].[AggregationChildren] (
[AggregationChildrenId] INT NOT NULL,
[AggregationId] INT NOT NULL,
[Position] INT NOT NULL,
CONSTRAINT [PK_AGGREGATION_CHILDS] PRIMARY KEY CLUSTERED ([AggregationChildrenId] ASC),
CONSTRAINT [FK_AggregationChildren_Code]
FOREIGN KEY ([AggregationChildrenId])
REFERENCES [dbo].[Code] ([CodeId]),
CONSTRAINT [FK_AggregationChildren_Aggregation]
FOREIGN KEY ([AggregationId])
REFERENCES [dbo].[Aggregation] ([AggregationId]) ON DELETE CASCADE
)
Aggregation
并AggregationChildren
表示表中行之间的关系Code
。
聚合将有 1 个或多个子聚合。而且,聚合子项中的代码可以有 0 个或多个聚合子项。
它是这样的:
Code1
|___________________
| |
Code2 Code3
|________ |________________
| | | | |
Code4 Code5 Code6 Code7 Code8
以上都是Code.Serial
价值观。
Code.CodeId
这些连续出版物的所有值都在和的Aggregation
表Code1
中。Code2
Code3
并且,对于那些连续剧,Code2
、Code3
、Code4
、Code5
、Code6
、Code7
和Code8
在AggregationChildren
表中。
我需要更新Code.CommissioningFlag
所有这些连续剧。
我创建了一个存储过程来递归调用。我作为参数传递Code1
,它将对Code2
and进行递归调用Code3
。
此方法适用于一些代码,但现在,我必须更新 3,000 个代码,它会阻止 SQL Server。
我以为我已经导航抛出“树”并获得一个包含所有代码的临时表,以及所有代码的执行和更新,但我不知道如何在 SQL 中“导航树”。
我怎样才能让所有的代码一次更新所有的代码?
根据您的解释,我认为您可以使用递归解决方案。我已经建立了一个最小的例子:
锚点从 中选择第一行,
dbo.Aggregation
递归查询行从中匹配 AggregationId 的。dbo.AggregationChildren
AggregationId
dbo.Aggregation
然后使用递归查询返回的 ID 列表简单地更新
Code
表。db<>fiddle here