Creare Query estrapolazione ad albero

di il
3 risposte

Creare Query estrapolazione ad albero

Ciao a tutti,
mi chiamo Rossella e sono nuova del gruppo. Da qualche giorno mi sono imbattuta in una query che non riesco ad elaborare.
Premetto che non sono espertissima di SQL, ma sono pochi mesi che lo utilizzo.
Vi spiego il mio problema:
Ho due colonne:
Articolo padre Articolo figlio
A B
A C
A D
B E
B F

Quello che vorrei fare è una Query ad "albero", dove ad esempio io possa vedere da chi è composto A e non solo dal "primo livello".
in pratica il mio output dovrebbe essere:

Articolo 1 Articolo 2 Articolo 3
A B E
A B F
A C
A D

Poi sarebbe bellissimo se sotto l'articolo 1 ci fosse anche la B con i relativi figli nell'articolo 2 (ma forse questo è chiedere troppo? non lo so..).
Quindi devo creare una nuova colonna e rendere tutto in maniera gerarchica... è possibile?
Spero di essere stata chiara,
grazie a tutti quelli che mi aiuteranno!

3 Risposte

  • Re: Creare Query estrapolazione ad albero

    Ho appena visto che non ci sono gli spazi che separano le colonne. Quindi vi scrivo meglio :
    Articolo padre= A, A, A, B, B
    Articolo figlio= B, C, D, E, F


    Articolo 1= A, A, A, A
    Articolo 2= B, B, C, D
    Articolo 3= E, F
  • Re: Creare Query estrapolazione ad albero

    Salve,
    ti consiglio la lettura di https://www.mssqltips.com/sqlservertip/1520/recursive-queries-using-common-table-expressions-cte-in-sql-server/ dove vengono spiegate le ricorsioni utilizzando le common table expression, che rappresentano la soluzione al tuo problema...
    salutoni
    --
    Andrea
  • Re: Creare Query estrapolazione ad albero

    Rossella89 ha scritto:


    Ciao a tutti,
    ..
    Quello che vorrei fare è una Query ad "albero"
    ...
    Quindi devo creare una nuova colonna e rendere tutto in maniera gerarchica... è possibile?
    ...
    Ciao,

    i db non vengono in genere usati per mostrare i dati formattati con una particolare struttura;
    questo è un compito di regola affidato al programma che usa i dati.

    Ma se proprio vuoi , oltre alle CTE già suggerite, puoi anche provare una cosa del genere
    che però , limitazioni a parte, prenderei più come un gioco che altro.

    N.B. nota che crea oggetti nel database tempdb e che se già esistono li cancella
    
    USE tempdb
    GO
    
    if OBJECT_ID('dbo.tTree') is not null
    drop table dbo.tTree
    
    GO
    
    CREATE TABLE dbo.tTree (id int primary key, padre int, figlio varchar(200) )
    
    INSERT INTO dbo.tTree VALUES ( 1, NULL, 'Root' )
    INSERT INTO dbo.tTree VALUES ( 2, 1, 'Root-F1' )
    INSERT INTO dbo.tTree VALUES ( 3, 1, 'Root-F2' )
    INSERT INTO dbo.tTree VALUES ( 4, 2, 'Root-F1-F1' )
    INSERT INTO dbo.tTree VALUES ( 5, 3, 'Root-F2-F1' )
    INSERT INTO dbo.tTree VALUES ( 6, 4, 'Root-F1-F2' )
    INSERT INTO dbo.tTree VALUES ( 7, 6, 'Root-F1-F2-F1' )
    
    GO 
    
    if OBJECT_ID('dbo.spTree') is not null
    drop proc dbo.spTree
    
    go
    
    CREATE PROCEDURE dbo.spTree
    ( @id int)
    AS
    	DECLARE @level int
     
    	/* Creating temporary table for tree storage*/
    	declare @tmp_tree TABLE
    	(
    		id int NOT NULL PRIMARY KEY,
    		level int,
    		padre int,
    		figlio varchar(200),
    		sort varchar(max)
    	)
     
    	INSERT @tmp_tree (id, level, padre, figlio,sort)
    	SELECT id,0, padre, figlio,'A-' FROM dbo.tTree WHERE id = @id
    	SELECT @level = 0
     
    	WHILE 1 = 1
    	BEGIN
    		INSERT @tmp_tree (id, level,  padre, figlio, sort )
    		SELECT 
    			dbo.tTree.id, @level + 1, dbo.tTree.padre,  dbo.tTree.figlio as figlio
    			,replicate (tt.sort, @level+1)  +  CAST(dbo.tTree.id as varchar) +'-' as sort
    		FROM 
    			dbo.tTree inner join @tmp_tree tt
    			ON dbo.tTree.padre = tt.id
    		WHERE  			 tt.level = @level
     
    		IF @@rowcount = 0 BREAK
    		SELECT @level = @level + 1
    	END
     
    	SELECT id, padre, REPLICATE('-',level) +  figlio as figlio, level, sort
    	FROM @tmp_tree order by  sort
    GO
    
    -- vedo la tabella
    select * from dbo.tTree
    
    -- vedo l'albero a partire da id=1 come padre
    exec dbo.spTree @id=1
    
    -- vedo l'albero a partire da id=2 come padre
    exec dbo.spTree @id=2
    
    GO
    
    -- pulizia oggetti creati
    if OBJECT_ID('dbo.spTree') is not null
    drop proc dbo.spTree
    GO
    
    if OBJECT_ID('dbo.tTree') is not null
    drop table dbo.tTree
    GO
    
Devi accedere o registrarti per scrivere nel forum
3 risposte