Principales respuestas
Consulta recursiva tipo departamentos, jefes y empleados

Pregunta
-
Hola a todos
Tengo la siguiente tabla en SQL 2012
IF OBJECT_ID('tempdb..#Articulos','U') IS NOT NULL DROP TABLE #Articulos
CREATE TABLE #Articulos (Articulo varchar(20), Linea int, ArticuloMP varchar(20) )
INSERT INTO #Articulos VALUES ('00090',10000,'C1654')
,('00090',20000,'C1695')
,('00090',30000,'C1627')
,('00090',210000,'C1770')
,('00090',210001,'C1771')
,('C1770',20000,'C1715')
,('C1770',30000,'C1702')
,('C1770',40000,'C1719')
,('C1771',20000,'C1615')
,('C1771',30000,'C1802')
,('C1771',40000,'C1919')
,('C1715',20000,'C0615')
,('C1715',20010,'C0715')
como podéis ver algunos artículos forman parte de otros, por ejemplo el C1715 (que se compone por C0615 y C0715) es parte de C1770 que a su vez es un componente de 00090.
Después de ver varios ejemplos de consultas recursivas para jerarquías de departamentos, jefes y subordinados o de árbol genealógico he tratado de hacer una consulta para dado un articulo saber que otros artículos "cuelgan de el" pero sin obtener el resultado correcto, por ejemplo si selecciono el 00090 debería de obtener todos los registros de la tabla #Articulos, si filtro por el C1770 debería obtener
C1770 20000 C1715
C1770 30000 C1702
C1770 40000 C1719
C1715 20000 C0615
C1715 20010 C0715
Necesito por favor me ayuden, muchas gracias de antemano y saludos
Respuestas
-
Hola Raimundo Ferrer:
Una solución:
IF OBJECT_ID('tempdb..#Articulos','U') IS NOT NULL DROP TABLE #Articulos CREATE TABLE #Articulos (Articulo varchar(20) , Linea int , ArticuloMP varchar(20) ); INSERT INTO #Articulos VALUES ('00090',10000,'C1654') ,('00090',20000,'C1695') ,('00090',30000,'C1627') ,('00090',210000,'C1770') ,('00090',210001,'C1771') ,('C1770',20000,'C1715') ,('C1770',30000,'C1702') ,('C1770',40000,'C1719') ,('C1771',20000,'C1615') ,('C1771',30000,'C1802') ,('C1771',40000,'C1919') ,('C1715',20000,'C0615') ,('C1715',20010,'C0715'); DECLARE @Item varchar(20) = 'c1770'; With c as( Select a.Articulo , a.linea , a.ArticuloMP from #Articulos a where a.Articulo = @item union all Select b.Articulo , b.Linea , b.ArticuloMP from c join #Articulos b on c.ArticuloMP = b.Articulo ) select * from c
Las consultas recursivas, se montan de un modo bastante simple, utilizando tablas de expresión común.
Cte recursivo
https://javifer2.wordpress.com/2018/12/20/with-cte-tablas-de-expresion-comun-recursividad-3/
https://javifer2.wordpress.com/2018/12/24/with-cte-as-tablas-de-expresion-comun-recursividad-ordenar-4/
- Propuesto como respuesta Alberto PoblacionMVP martes, 25 de agosto de 2020 18:17
- Marcado como respuesta Raimundo Ferrer miércoles, 26 de agosto de 2020 15:56
Todas las respuestas
-
Hola Raimundo Ferrer:
Una solución:
IF OBJECT_ID('tempdb..#Articulos','U') IS NOT NULL DROP TABLE #Articulos CREATE TABLE #Articulos (Articulo varchar(20) , Linea int , ArticuloMP varchar(20) ); INSERT INTO #Articulos VALUES ('00090',10000,'C1654') ,('00090',20000,'C1695') ,('00090',30000,'C1627') ,('00090',210000,'C1770') ,('00090',210001,'C1771') ,('C1770',20000,'C1715') ,('C1770',30000,'C1702') ,('C1770',40000,'C1719') ,('C1771',20000,'C1615') ,('C1771',30000,'C1802') ,('C1771',40000,'C1919') ,('C1715',20000,'C0615') ,('C1715',20010,'C0715'); DECLARE @Item varchar(20) = 'c1770'; With c as( Select a.Articulo , a.linea , a.ArticuloMP from #Articulos a where a.Articulo = @item union all Select b.Articulo , b.Linea , b.ArticuloMP from c join #Articulos b on c.ArticuloMP = b.Articulo ) select * from c
Las consultas recursivas, se montan de un modo bastante simple, utilizando tablas de expresión común.
Cte recursivo
https://javifer2.wordpress.com/2018/12/20/with-cte-tablas-de-expresion-comun-recursividad-3/
https://javifer2.wordpress.com/2018/12/24/with-cte-as-tablas-de-expresion-comun-recursividad-ordenar-4/
- Propuesto como respuesta Alberto PoblacionMVP martes, 25 de agosto de 2020 18:17
- Marcado como respuesta Raimundo Ferrer miércoles, 26 de agosto de 2020 15:56
-
Hola Raimundo Ferrer:
Una solución:
IF OBJECT_ID('tempdb..#Articulos','U') IS NOT NULL DROP TABLE #Articulos CREATE TABLE #Articulos (Articulo varchar(20) , Linea int , ArticuloMP varchar(20) ); INSERT INTO #Articulos VALUES ('00090',10000,'C1654') ,('00090',20000,'C1695') ,('00090',30000,'C1627') ,('00090',210000,'C1770') ,('00090',210001,'C1771') ,('C1770',20000,'C1715') ,('C1770',30000,'C1702') ,('C1770',40000,'C1719') ,('C1771',20000,'C1615') ,('C1771',30000,'C1802') ,('C1771',40000,'C1919') ,('C1715',20000,'C0615') ,('C1715',20010,'C0715'); DECLARE @Item varchar(20) = 'c1770'; With c as( Select a.Articulo , a.linea , a.ArticuloMP from #Articulos a where a.Articulo = @item union all Select b.Articulo , b.Linea , b.ArticuloMP from c join #Articulos b on c.ArticuloMP = b.Articulo ) select * from c
Las consultas recursivas, se montan de un modo bastante simple, utilizando tablas de expresión común.
Cte recursivo
https://javifer2.wordpress.com/2018/12/20/with-cte-tablas-de-expresion-comun-recursividad-3/
https://javifer2.wordpress.com/2018/12/24/with-cte-as-tablas-de-expresion-comun-recursividad-ordenar-4/