Visualizzazione tabella relazionale tramite DataGridView - problema in...

martedì 14 aprile 2009 - 17.16

Luka90 Profilo | Junior Member

Salve a tutti!

Torno a rompere un po le scatole...

Il problema è il seguente:
devo riempire un DataGridView con i vari record di una tabella. La tabella in questione però in molti dei suoi campi contiene le chiavi (degli ID integer) che fanno riferimento ad altre tabelle. A me interessa riempire il DataGrid con la loro interpretazione che si trova nel campo Descrizione delle altre tabelle, altrimenti il risultato sarebbe una tabella piena di numeri!

Es: (caso assurdo, premetto)
Con un semplice SELECT * FROM PERSONE otterrei per ipotesi --> NOME=5 CITTA'=56 ecc
Nella tabella NOMI ho, dove la chiave è 5 appnto, GIOVANNI e nella tabella CITTA' alla chiave 56 ROMA.

Voglio ottenere ---> NOME=GIOVANNI CITTA'=ROMA

Tutto questo si può fare con una query? Che alternative posso avere?

Grazie mille in anticipo!

Luca

Jeremy Profilo | Guru

Ciao Luca.
Per ottenere il risultato dell'esempio che hai postato la query che devi scrivere è la seguente:
SELECT Persone.Nome,Citta.Citta FROM Persone,Citta WHERE Persone.IdCitta=Citta.IdCitta
Lascio a te il resto delle considerazioni.

Facci sapere...
Ciao

Luka90 Profilo | Junior Member

Intanto, grazie della pronta risposta!

Lo so, la query che posso fare può essere considerata così. Il problema è che nel mio caso le chiavi che dovrei interpretare sono almeno 6! Diventa ostico temo. Quello che vorrei sapere è se esistono altri modi, anche perchè poi, devo dare la possibilità di modificare questi dati!
La query di UPDATE necessita a sua volta non più dell'interpretazione ma della chiave (il numeretto per intenderci).

Non so come gestire allora la parte software con quella cognitiva dell'utente che deve vedere l'interpretazione del codice numerico che identifica il record, mentre il programma deve salvare o aggiornare il record utilizzando questo numero e non la sua interpretazione che risulta una stringa.

Spero di essermi spiegato

Se non esiste altro modo al di fuori di una query megagalattica e qualche artificio, mi rassegnerò

Luca

Luka90 Profilo | Junior Member

Possibile che non esista altra soluzione? ç_ç

Luca

Brujo Profilo | Newbie

Forse non ho capito bene il problema, ma in pratica devi mostrare delle descrizioni da alcune tabelle di decodifica?
In questo caso fai delle join e te la sgami

SELECT Persone.* , Citta.Descrizione FROM Persone INNER JOIN Citta ON Persone.IDCitta = Citta.IDCitta

Edit: in pratica quoto Jeremy

Jeremy Profilo | Guru

Ciao Luca.
Magari esiste, solo che non ho capito bene il problema.
Prova a rispondere a queste domande:
-Quali campi vuoi ottenere come risultato della query?
-In base a quale criteri?
-Conosci le query parametriche(o parametrizzate che dir si voglia)?



Facci sapere...
Ciao

Luka90 Profilo | Junior Member

Intanto grazie ad entrambi per la pazienza
E' una abbastanza difficile da spiegare.

-Quali campi vuoi ottenere come risultato della query?

Tutti i campi di una tabella che è in relazione con altre 5.

-In base a quale criteri?

In base ai campi che, in questa tabella relazionale, sono quasi tutti FOREIGN KEY che si riferiscono alle altre 5 tabelle (integer auto increment per capirci).

-Conosci le query parametriche(o parametrizzate che dir si voglia)?

Credo di si, ma forse non le chiamo così però. Forse con un esempio ti so rispondere ^_^

Il problema è che al posto di una result tipo:

"Luca" 4 6 23 7

Ottenuto con una semplice "select * form..." vorrei:

"Luca" "Impiegato" "Biondo" "Monolocale" "Nuovo membro"

Con le inner join non posso, perchè alcuni di questi campi, anche se sono chiavi, possono essere null e quindi la lunghissima query non mi da nulla!!!
( Un ragazzo può anche non aver registrato il suo impiego, oppure di che dolore ha i capelli)

Scusate l'esempio sciocco XD



Luca

Brujo Profilo | Newbie

>Intanto grazie ad entrambi per la pazienza
>E' una abbastanza difficile da spiegare.
>
>-Quali campi vuoi ottenere come risultato della query?
>
>Tutti i campi di una tabella che è in relazione con altre 5.
>
>-In base a quale criteri?
>
>In base ai campi che, in questa tabella relazionale, sono quasi
>tutti FOREIGN KEY che si riferiscono alle altre 5 tabelle (integer
>auto increment per capirci).
>
>-Conosci le query parametriche(o parametrizzate che dir si voglia)?
>
>Credo di si, ma forse non le chiamo così però. Forse con un esempio
>ti so rispondere ^_^
>
>Il problema è che al posto di una result tipo:
>
>"Luca" 4 6 23 7
>
> Ottenuto con una semplice "select * form..." vorrei:
>
>"Luca" "Impiegato" "Biondo" "Monolocale" "Nuovo membro"
>
>Con le inner join non posso, perchè alcuni di questi campi, anche
>se sono chiavi, possono essere null e quindi la lunghissima query
>non mi da nulla!!!
>( Un ragazzo può anche non aver registrato il suo impiego, oppure
>di che dolore ha i capelli)
>
>Scusate l'esempio sciocco XD
>
>
>
>Luca

LEFT JOIN allora...le join che non tornano niente le controlli con un bell'IsNull

Luka90 Profilo | Junior Member

Si hai ragione! Grazie mille!

Però resta ancora un ultimo problema che non riesco a risolvere. Io ho due campi nella tabella relazionale che hanno corrispondenze nella stessa tabella.

Un esempio potrebbe essere:

AMICI( nome1, nome2, altri parametri...)
NOMI(id_nome, nome)

sia nome1 che nome2 fanno riferimento a NOMI. Come lo metto nell'interrogazione con la join, in modo che mi restituisca entrambi?

SELECT nomi.nome, ??? FROM amici INNER JOIN nomi on nome1=nome ???

non riesco a formurarla...

Ad ogni modo, grazie mille! Ora eviterò di fare funzioni assurde che mi convertono ogni singolo campo, e tutto grazie ad una query che prima non riuscivo a fare.
Se riesco a risolvere questo ultimo neo, sono a posto!

Luca

Brujo Profilo | Newbie

>Si hai ragione! Grazie mille!
>
>Però resta ancora un ultimo problema che non riesco a risolvere.
>Io ho due campi nella tabella relazionale che hanno corrispondenze
>nella stessa tabella.
>
>Un esempio potrebbe essere:
>
>AMICI( nome1, nome2, altri parametri...)
>NOMI(id_nome, nome)
>
>sia nome1 che nome2 fanno riferimento a NOMI. Come lo metto nell'interrogazione
>con la join, in modo che mi restituisca entrambi?
>
>SELECT nomi.nome, ??? FROM amici INNER JOIN nomi on nome1=nome
>???
>
>non riesco a formurarla...
>
>Ad ogni modo, grazie mille! Ora eviterò di fare funzioni assurde
>che mi convertono ogni singolo campo, e tutto grazie ad una query
>che prima non riuscivo a fare.
>Se riesco a risolvere questo ultimo neo, sono a posto!
>
>Luca

mmm, sai che potrebbe essere un problema? hai nella stessa tabella + campi che fanno riferimento ad un'altra? secondo me ti stai complicando un po la vita e oltretutto rischia di non funzionarti niente cmq se fosse così.

struttura che ho capito

Tabella_AMICI
Nome1 -->join Tabella_Nome
Nome2 --> join Tabella_Nome

sarebbe meglio evitare una cosa del genere cercando di avere una struttura un po + "normale", non so, per farti un esempio

Tabella_AMICI
ProgressivoAmico
Nome --> join Tabella_Nome

altrimenti quando vai a fare la join sei costretto a farne due per ogni interrogazione.

Luka90 Profilo | Junior Member

Ma i due nomi nel mio esempio erano proprio due progressivi che puntavano ad una riga di NOMI.

Credo di aver risolto! usando gli alias, posso farlo richiamando due volte una join.

Come dici te, probabilmente non è corretto, però è l'unico modo.
La situazione reale è che ho una tabella con i lavori dove registro sia CHI deve fare il lavoro e sia CHI quel lavoro lo ha segnalato.
Questi due CHI sono due progressivi che puntano alla tabella degli OPERATORI. Non trovo altra soluzione... Capisci?

Ringrazio tutti! Questa della LEFT mi ha salvato ^_^
Grazie come sempre!



Luca

Brujo Profilo | Newbie

figurati, facevo per dire, poi le esigenze che hai chiaro che le sai solo te
bella
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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5