Aquí hay un árbol de ensamblaje que quiero buscar usando una T-SQL
consulta recursiva (presumiblemente CTE
) con los resultados esperados a continuación. Quiero saber la cantidad total por ensamblaje dada cualquier parte.
Es decir, si busco 'Remache', quiero saber el recuento total en cada nivel dentro de la asamblea, no solo el recuento directo de niños.
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
Actualmente, puedo obtener los padres directos, pero quiero saber cómo extender mi CTE para permitirme transferir esta información hacia arriba.
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
Guion de creacion
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)
fuente
No estoy seguro de entender lo que quiere decir con "cantidad" y de dónde provienen las identificaciones y el recuento de PartInstances y columnas de la tabla en su muestra, pero calculé lo que supongo a partir de sus datos de muestra.
Espero que esto te dé algunas ideas.
Actualizar
Entiendo que este es un ejemplo de prueba, pero sus datos rompen todo a partir de
1NF
. Lo más probable es que su mesa se divida en dos y se normalice.fuente