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