Sql e dataset

venerdì 22 ottobre 2004 - 12.15

mon78 Profilo | Junior Member

ciao a tutti vi spiego il mio problema: ho una tabella nel database sql in cui ho una relazione ricorsiva, tra padre e figlio, tra la chiave primaria idpersona e la chiave esterna idpadre; mi creo una query sql che estrae dalla tabella il nome del padre e per ognuno di essi i nomi dei figli; associo il risultato ad un dataset, che è fatto da due colonne: il nome del padre a sinistra e il nome del figlio a destra; se un figlio(il cui nome compare a destra) ha a sua volta dei figli, il suo nome compare anche a sinistra del dataset, e i nomi dei suoi figli stanno a destra; io voglio che nel dataset compaia sì la gerarchia come detto prima, ma a partire da una data persona; se inserisco nella query la clausola where='' con l'id della persona che devo estrarre non funziona perchè mi estrae solo le righe della tabella con quell'id, ma nn le righe che contengono i suoi figli, i figli di questi ultimi e così via. come devo fare? nn sono esperta di sql server, qualcuno mi può aiutare x favore? grazie mille

fguida Profilo | Expert

Ciao.. potresti spiegarmi meglio come è strutturato il db, ovvero le tabelle che ti interessano, e quello che devi estrarre?
Non ho capito molto bene...

Francesco

Caleidoscopio Profilo | Newbie

Anche io sono un pò confuso i merito alla struttura del tuo DB, ma mi sebra di capire che il tuo errore sta solo nella POSIZIONE della tua clausola WHERE ID=.

La tabella da cui prendi i figli fa una join sull' ID dei padri = ID dei figli???

Se ho intuito correttamente la struttura del DB....forse fuonzionerebbe una select tipo:


select * from tbl_figli where ID in (select * from tbl_padri where ID=2)
sempre che io abbia capito quello che vuooi fare.....

mon78 Profilo | Junior Member

Grazie prima di tutto della disponibilità; provo ad essere più chiara:la tabella(persona) del database ha 3 campi: idpersona, nome, idpadre; idpersona è la chiave primaria; idpadre è la chiave esterna che stabilisce la relazione tra un figlio e il padre; creo una query sql che mi deve estrarre l'elenco di tutti i padri con i relativi figli:
select padre.idpersona, padre.nome, figlio.idpersona, figlio.nome
from persona as padre, persona as figlio
where padre.idpadre=figlio.idpersona

la query sql mi restituisce un elenco di tutti i padri della tabella, e per ogni padre tutti i suoi figli; e così via; quindi in una riga ho il nome del padre con il nome del figlio; se quest'ultimo ha dei figli ho un'altra riga con il nome del figlio(che ora compare come padre) con il nome di un suo figlio: questo per tutte le persone della tabella.
Il problema è che io voglio sì quest'elenco, ma nn di tutte le persone della tabella, ma devo considerare una data persona, e voglio che il risultato della query contenga un insieme di righe per i figli della persona considerata, per i figli dei suoi figli e così via. Ho provato ad inserire la clausola where per fissare l'id della persona, ma limito le righe solo a quelle che hanno l'id considerato; e per tutta la gerarchia come devo fare?
Forse nn sono stata chiara, è difficile spiegarti bene, cmq se nn hai capito qualcosa sono qui a chiarirti tutto.
Ancora grazie

fguida Profilo | Expert

Sperando di aver compreso... innanzitutto devi fare una inner join fra le tue tabelle; poi devi fare solo una select del figlio(sia Id che nome), con where condition sotto l'id del padre....

mon78 Profilo | Junior Member

Ho fatto il join tra le due tabelle. cmq nn sto capendo qualcosa: io voglio che per ogni riga estratta ci sia il nome del padre(a sinistra) e il relativo nome del figlio(a destra); quindi penso che nella select devo mettere sia il nome del padre che quello del figlio

select padre.nome, figlio.nome
from persona as padre inner join persona as figlio

se metto where padre.idpersona='7' mi estra solo le righe con idpersona='7' e i relativi figli diretti, ma a me servono anche le righe con altri idpersona come padre(che quindi compaiono a sinistra), che magari sono figli di '7' e padri di altre persone
OK?

fguida Profilo | Expert

select padre.nome, figlio.nome
from padre
inner join figlio on padre.idpadre = figlio.idpadre
where padre.idpadre = "Id"

Prova così.... la inner avviene tra id primario della tabella padre, ed id secondario dell atabella figlio(sempre l'id del padre, per mantenere il legame).

mon78 Profilo | Junior Member

Il problema rimane; vengono estratte solo le righe il cui idpadre è quello fissato; questo fa si che per il padre fissato vedo i relativi figli, e basta; se poi questi ultimi hanno altri figli, le relative righe nn sono restituite dalla select; forse il problema è nella where ma nn so come risolverlo. Tu che dici?

fguida Profilo | Expert

Spiegami una cosa... le tabelle sono due:
Padre
Figlio
Inoltre hai la possibilità che i figli abbiano altri figli???
Ed in quale tabella li inserisci i "nipoti"??
Forse i figli, passano nella tabella padri, ed i nipoti in quella figli??

Francesco

mon78 Profilo | Junior Member

No, la tabella è una sola: persona.
questa ha tre campi: idpersona(chaive primaria), nome, e idpadre(chiave esterna).
La relazione è ricorsiva sulla tabella stessa, tra idpersona e idpadre.
Inoltre un figlio, oltre ad avere un padre, può essere anche lui un padre, e quindi può avere dei figli, e così via.
Ecco perchè una persona può comparire in una riga come figlio (nella colonna di destra restituita dalla select), ma anche in un'altra riga come padre (nella colonna di sinistra restituita dalla select); quindi se fisso una persona (come padre) mi compaiono le righe coi suoi figli, ma se questi ultimi sono anche padri, le relative righe nn compaiono, poichè ho fissato l'idpadre.

fguida Profilo | Expert

A, ora ho capito come è fatta la tabella..(scusa ma oggi ho un gran mal di testa); è la prima volta cmq che mi capita una query del genere... e non avendo ora il query analizer sotto mano, non riesco nemmeno a fare una prova... Mon, ora provo a pensar su qualcosa..

Francesco

mon78 Profilo | Junior Member

Scusami tu, se potessi farei volentieri a meno di disturbarti ancora. Ma nn sto riuscendo a risolvere da sola il problema; cmq nn posso modoficare nulla, poichè a me serve una gerarchia tra padri e figli,
Grazie ancora

fguida Profilo | Expert

Ma, suddividerla in due tabelle? Hai pensato a questa eventualità, oppure non è idonea?
(cerco di rendermi un idea di cio' che ti occorre)

mon78 Profilo | Junior Member

L'idea è questa: io ho una sola tabella persona; perchè creare due tabelle che sarebbero uguali?
Una volta che ottengo il risultato della query lo associo ad un dataset, e così mi carico un treeview che rispecchia la gerarchia tra padre e figli, a partire da un dato padre che l'utente ha precedentemente scelto.

fguida Profilo | Expert

Prova così...

select persona.nomepadre, persona.nomefiglio
from persona
where (persona.idpadre = "X"
and
persona.idpadre = (select persona.idfiglio from persona where persona.idpadre = "X"))

amelix Profilo | Expert

Con la query "select padre.nome, figlio.nome
from padre
inner join figlio on padre.idpadre = figlio.idpadre"
Ti viene restituito qualsiasi "Padre" con almeno un figlio.
Anche i "Figli" con dei "Figli" compariranno xke' sono a loro volta padri.

Io lo uso che la treeview delle "zone" (Stato->Regione->Provincia->....)

Se non ho capito o ho detto delle idiozie... Ignoratemi!

amelix Profilo | Expert

Se hai bisogno del Padre/i e i Figli/o
"select padre.nome, figlio.nome
from padre
inner join figlio on padre.idPersona = figlio.idpadre
where figlio.idPersona = @ID OR padre.IdPadre = @ID"

PS. Ho visto adesso un'errore nel JOIN del post di prima...

LudovicoVan Profilo | Junior Member

Ciao mon78,

non è semplicissimo quello che vuoi fare.

Prova a dare un'occhiata a questo articolo per vedere come implementare in T-SQL una vista ad albero: http://www.mmkit.com/article.php?sid=345&lang=it_IT

Dovrebbe essere proprio quello che stai cercando.

Se hai dubbi fatti pure sentire... -LV

[Pardon, un test... <a href="x">x</a> [url=x]x[/url]]
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 !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5