none
Consulta recursiva tipo departamentos, jefes y empleados RRS feed

  • 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
    lunes, 24 de agosto de 2020 21:28

Respuestas

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/

    martes, 25 de agosto de 2020 3:49
  • 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/

    Muchas gracias Javi, justo lo que necesitaba, y tienes razón, al menos en este caso es bastante simple, quizás le di muchas vueltas antes. Me leeré los artículos, un saludo
    miércoles, 26 de agosto de 2020 16:11