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
ASP.NET 1.0/1.1
Sql e dataset
venerdì 22 ottobre 2004 - 12.15
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
mon78
Profilo
| Junior Member
167
messaggi | Data Invio:
ven 22 ott 2004 - 12:15
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
524
messaggi | Data Invio:
ven 22 ott 2004 - 13:57
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
49
messaggi | Data Invio:
ven 22 ott 2004 - 14:57
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
167
messaggi | Data Invio:
ven 22 ott 2004 - 15:08
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
524
messaggi | Data Invio:
ven 22 ott 2004 - 15:15
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
167
messaggi | Data Invio:
ven 22 ott 2004 - 15:42
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
524
messaggi | Data Invio:
ven 22 ott 2004 - 15:48
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
167
messaggi | Data Invio:
ven 22 ott 2004 - 16:02
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
524
messaggi | Data Invio:
ven 22 ott 2004 - 16:04
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
167
messaggi | Data Invio:
ven 22 ott 2004 - 16:16
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
524
messaggi | Data Invio:
ven 22 ott 2004 - 16:20
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
167
messaggi | Data Invio:
ven 22 ott 2004 - 16:23
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
524
messaggi | Data Invio:
ven 22 ott 2004 - 16:28
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
167
messaggi | Data Invio:
ven 22 ott 2004 - 16:34
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
524
messaggi | Data Invio:
lun 25 ott 2004 - 08:47
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
694
messaggi | Data Invio:
lun 25 ott 2004 - 10:45
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
694
messaggi | Data Invio:
lun 25 ott 2004 - 10:50
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
106
messaggi | Data Invio:
mar 2 nov 2004 - 21:35
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]]
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 !