Aqui está uma árvore de montagem que desejo pesquisar usando uma T-SQL
consulta recursiva (presumivelmente CTE
) com os resultados esperados abaixo. Eu quero saber o valor total por montagem dada qualquer peça.
Ou seja, se eu pesquisar 'Rivet', quero saber a contagem total em cada nível da montagem, não apenas a contagem direta de filhos.
Assembly (id:1)
|
|-Rivet
|-Rivet
|-SubAssembly (id:2)
| |
| |-Rivet
| |-Bolt
| |-Bolt
| |-SubSubAssembly (id:3)
| |
| |-Rivet
| |-Rivet
|
|-SubAssembly (id:4)
|-Rivet
|-Bolt
DESIRED Results
-------
ID, Count
1 , 6
2 , 3
3 , 2
4 , 1
Atualmente, posso obter os pais diretos, mas quero saber como estender meu CTE para permitir que eu role essas informações para cima.
With DirectParents AS(
--initialization
Select InstanceID, ParentID
From Instances i
Where i.Part = 'Rivet'
UNION ALL
--recursive execution
Select i.InstanceID, i.ParentID
From PartInstances i INNER JOIN DirectParents p
on i.ParentID = p.InstanceID
)
select ParentID, Count(instanceid) as Totals
from DirectParents
group by InstanceID, ParentID
Results
-------
ID, Count
1 , 2
2 , 2
3 , 2
4 , 1
script de criação
CREATE TABLE [dbo].[Instances] (
[InstanceID] NVARCHAR (50) NOT NULL,
[Part] NVARCHAR (50) NOT NULL,
[ParentID] NVARCHAR (50) NOT NULL, );
INSERT INTO Instances
Values
(1, 'Assembly', 0),
(50, 'Rivet', 1),
(50, 'Rivet', 1),
(2, 'SubAssembly', 1),
(50, 'Rivet', 2),
(51, 'Bolt', 2),
(51, 'Bolt', 2),
(3, 'SubSubAssembly', 2),
(50, 'Rivet', 3),
(50, 'Rivet', 3),
(4, 'SubAssembly2', 1),
(50, 'Rivet', 4),
(51, 'Bolt', 4)
Este CTE recursivo ( SQL Fiddle ) deve funcionar com sua amostra:
Resultado
Nota: Você mencionou nos comentários que a questão contém apenas uma tabela de amostra simplificada e os dados reais têm índices adequados e lidam com duplicatas e dados adequadamente.
Dados usados ( SQL Fiddle ):
Não tenho certeza se entendi o que você quer dizer com "quantia" e de onde a tabela (?) PartInstances e colunas id e count vêm em sua amostra, mas calculei o que acho de seus dados de amostra.
Espero que isso lhe dê algumas idéias.
Atualizar
Eu entendo que este é um exemplo de teste, mas seus dados quebram tudo a partir de
1NF
. Muito provavelmente sua tabela deve ser dividida em duas e normalizada.