Tenho um SQL Server 2016 com as seguintes tabelas:
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
e AggregationChildren
representam as relações entre as linhas na tabela Code
.
Uma agregação terá 1 ou mais filhos de agregação. E também, um código em filhos de agregação pode ter 0 ou mais filhos de agregação.
É algo assim:
Code1
|___________________
| |
Code2 Code3
|________ |________________
| | | | |
Code4 Code5 Code6 Code7 Code8
Todos os itens acima são Code.Serial
valores.
Todos os Code.CodeId
valores para esses seriais estão na Aggregation
tabela para Code1
, Code2
e Code3
.
E, para esses seriados, Code2
, Code3
, Code4
, Code5
, Code6
, Code7
, e Code8
estão na AggregationChildren
tabela.
Eu preciso atualizar Code.CommissioningFlag
para todos esses seriados.
Eu criei um procedimento armazenado para chamado recursivamente. Eu passo Code1
como argumento e ele fará uma chamada recursiva para Code2
e Code3
.
Esse método funciona bem com alguns códigos, mas agora preciso atualizar 3.000 códigos e ele bloqueia o SQL Server.
Eu pensei em navegar, lançar a 'árvore' e obter uma tabela temporária com todos os códigos, e fazer e atualizar para todos eles, mas não sei como 'navegar na árvore' no SQL.
Como posso obter todos os códigos para atualizar todos de uma vez?
De acordo com sua explicação, acho que você poderia usar uma solução recursiva. Eu configurei um exemplo mínimo:
A âncora seleciona a primeira linha de
dbo.Aggregation
, e as linhas de consulta recursiva dedbo.AggregationChildren
ondeAggregationId
correspondem AggregationId dedbo.Aggregation
.Em seguida, basta atualizar
Code
a tabela usando a lista de IDs retornada pela consulta recursiva.db<>fiddle here