Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
SQL Server 2000/2005/2008, Express, Access, MySQL, Oracle
Query per recuperare dati da struttura ad albero
martedì 09 dicembre 2008 - 17.55
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
gonzalezh
Profilo
| Junior Member
71
messaggi | Data Invio:
mar 9 dic 2008 - 17:55
Ciao,
Io ho una tabella sql che per il seguente albero di esempio è così costruita:
albero di esempio:
root
livello 1
figlio 1.1
figlio 1.2
livello 2
figlio 2.1
figlio 2.2
(l'albero può avere fino a 11 livelli di annidamento)
il livello root ha ordine_in_albero = null
il root è filgio di se stesso
id-iesimo è l'id del nodo padre (annidato)
e i restanti id (fino al 10) coincide con l'id_gruppo.
id_gruppo, codice , ordine_in_albero, id0, id1, id2, id3, id4, id5, id6, id7, id8, id9, id10
1 , root , null ,1 ,1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1
2 ,livello 1 , 1 ,1 ,2 , 2 , 2 ,2 , 2 , 2 , 2 , 2 , 2 , 2
3 ,livello 2 , 4 ,1 ,3 ,3 , 3 ,3 , 3 , 3 , 3 , 3 , 3 , 3
4 ,figlio 1.1 , 2 ,1 ,2 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4, 4
5 ,figlio 1.2 , 3 ,1 ,2 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5, 5
6 ,figlio 2.1 , 5 ,1 ,3 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6, 6
7 ,figlio 2.2 , 6 ,1 ,3 , 7 , 7 , 7 , 7 , 7 , 7 , 7 , 7, 7
Devo creare una query che mi dia il seguente risultato:
item gruppo_padre_di primo_livello
root root
livello 1 root
livello 2 root
figlio 1.1 livello 1
figlio 1.2 livello 1
figlio 2.1 livello 2
figlio 2.2 livello 2
come devo impostare la query per fare ciò?
Grazie in anticipo,
spero di non essermi ingarbugliata troppo nella spiegazione.
H.
lbenaglia
Profilo
| Guru
5.625
messaggi | Data Invio:
mar 9 dic 2008 - 20:59
>spero di non essermi ingarbugliata troppo nella spiegazione.
Ciao Helen,
Che versione di SQL Server utilizzi?
Puoi postare la struttura della tabella (CREATE TABLE), alcune righe di prova (INSERT INTO) ed il result set finale che vuoi ottenere?
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
gonzalezh
Profilo
| Junior Member
71
messaggi | Data Invio:
mer 10 dic 2008 - 10:25
Ciao,
utilizzo SQL Server 2005.
CREATE TABLE [dbo].[tabella](
[id_gruppo] [int] IDENTITY(1,1) NOT NULL,
[codice] [varchar](50) NULL,
[ordine_in_albero] [int] NULL,
[id0] [int] NULL,
[id1] [int] NULL,
[id2] [int] NULL,
[id3] [int] NULL,
[id4] [int] NULL,
[id5] [int] NULL,
[id6] [int] NULL,
[id7] [int] NULL,
[id8] [int] NULL,
[id9] [int] NULL,
[id10] [int] NULL
)
INSERT INTO [dbo].[tabella]
VALUES ( 'root' , null ,1 ,1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1, 1 )
GO
INSERT INTO [dbo].[tabella]
VALUES ('livello 1' , 1 ,1 ,2 , 2 , 2 ,2 , 2 , 2 , 2 , 2 , 2 , 2)
GO
INSERT INTO [dbo].[tabella]
VALUES ('livello 2' , 4 ,1 ,3 ,3 , 3 ,3 , 3 , 3 , 3 , 3 , 3 , 3)
GO
INSERT INTO [dbo].[tabella]
VALUES ('figlio 1.1' , 2 ,1 ,2 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4, 4)
GO
INSERT INTO [dbo].[tabella]
VALUES ('figlio 1.2' , 3 ,1 ,2 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5, 5)
GO
INSERT INTO [dbo].[tabella]
VALUES ('figlio 2.1' , 5 ,1 ,3 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6, 6)
GO
INSERT INTO [dbo].[tabella]
VALUES ('figlio 2.2' , 6 ,1 ,3 , 7 , 7 , 7 , 7 , 7 , 7 , 7 , 7, 7)
GO
--Vorrei ottenere il seguente risultato:
item gruppo_padre_di primo_livello
'root' 'root'
'livello 1' 'root'
'livello 2' 'root'
'figlio 1.1' 'livello 1'
'figlio 1.2' 'livello 1'
'figlio 2.1' 'livello 2'
'figlio 2.2' 'livello 2'
gonzalezh
Profilo
| Junior Member
71
messaggi | Data Invio:
mer 10 dic 2008 - 11:18
ho risolto così:
con questa query:
SELECT p.codice [padre], f.codice [figlio]
FROM tabella p CROSS JOIN
tabella AS f
WHERE
p.id_gruppo = f.id1
ottengo questo risultato:
padre figlio
root root
livello 1 livello 1
livello 1 figlio 1.1
livello 1 figlio 1.2
livello 2 livello 2
livello 2 figlio 2.1
livello 2 figlio 2.2
Grazie mille.
gonzalezh
Profilo
| Junior Member
71
messaggi | Data Invio:
mer 10 dic 2008 - 18:28
ho modificato ulteriormente la query in questo modo:
SELECT p.codice [padre], f.codice [figlio]
FROM tabella p CROSS JOIN
tabella AS f
where
(p.codice <> f.codice) and (p.id_gruppo = f.id1)
OR (P.ID_GRUPPO = F.ID0 AND F.ORDINE_IN_ALBERO IS NOT NULL)
and ((f.id1 = f.id2) or p.id1 <> p.id2)
per ottenere questi dati:
padre figlio
root livello 1
root livello 2
livello 1 figlio 1.1
livello 1 figlio 1.2
livello 2 figlio 2.1
livello 2 figlio 2.2
Torna su
Stanze Forum
Elenco Threads
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?
Dopo esserti registrato potrai chiedere
aiuto sul nostro
Forum
oppure aiutare gli altri
Consulta le
Stanze
disponibili.
Registrati ora !