Query su tabella con due record collegati allo stesso id

giovedì 28 settembre 2006 - 19.47

zseven Profilo | Senior Member

Cerco di spiegarmi meglio.
Ho una tabella chiamata tab_contatti che ha due campi, MITTENTE e DESTINATARIO.
Entrambi prendono il valore dall'ID di un'altra tabella chiamata tab_archivio.
Adesso devo mostrare il tutto in un datagrid, però invece di mostrare gli ID ovviamente vorrei mostrare i nomi collegati all'ID... ma purtroppo non ci riesco.
Ho provato con una query del genere:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Ma non ottengo il risultato sperato, infatti mi restituisce due righe, e su ognuna il mittente è uguale al destinatario.

Spero di essermi spiegato bene.
Riuscita a darmi una mano per risolvere?

Grazie mille

bluland Profilo | Guru

e come direbbe il grande Lorenzo, potresti riportare anche la tabella con qualche insert??

saluti

VP

zseven Profilo | Senior Member

dunque.
TAB_archivio

ID_archivio | ragione |
1 | MARIO ROSSI
2 | CARLO COPPOLA


TAB_contatti
Mittente | Destinatario | Oggetto
1 | 2 | prima comunicazione
1 | 2 | seconda comunicazione
2 | 1 | altra comunicazione con mittente inverso a destinatario

Spero che lo schemino sia chiaro

bluland Profilo | Guru

beh mi aspettavo una forma di CREATE TABLE da un lato ed INSERT INTO dall'altro, perche per verificare me le devo creare io le tabella a capo, ma che db usi?

zseven Profilo | Senior Member

forse non ero stato chiaro.
in pratica al posto di "1" e "2" vorrei mostrare rispettivamente MARIO ROSSI e CARLO COPPOLA.

bluland Profilo | Guru

si che db usi ?

zseven Profilo | Senior Member

ACCESS.
Se vuoi ti allego un db di esempio con solo queste due tabelle all'interno

zseven Profilo | Senior Member

eccolo l'allegato.
Grazie

bluland Profilo | Guru

non ho provato Access ma cmq la query dovrebbe essere cosi:

SELECT DEST.DEST,MITT.MITT,MITT.OGGETTO FROM ( SELECT dbo.Tab_Archivio. Ragione AS DEST, dbo.Tab_Contatti.Oggetto AS OGGETTO FROM dbo.Tab_Contatti INNER JOIN dbo.Tab_Archivio ON dbo.Tab_Archivio.id_Archivio = dbo.Tab_Contatti.Mittente) DEST LEFT OUTER JOIN (SELECT dbo.Tab_Archivio.Ragione AS MITT , dbo.Tab_Contatti.Oggetto AS OGGETTO FROM dbo.Tab_Contatti INNER JOIN dbo.Tab_Archivio ON dbo.Tab_Archivio.id_Archivio = dbo.Tab_Contatti.Destinatario) MITT ON DEST.OGGETTO = MITT.OGGETTO ORDER BY MITT.OGGETTO

saluti

ENzo

lbenaglia Profilo | Guru

>eccolo l'allegato.
Vedo le due tabelle ma non capisco che relazione ci sia tra di loro...

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

bluland Profilo | Guru

Ciao Lorenzo,
ma la query che ho proposto va bene per access??


saluti

ENzo

zseven Profilo | Senior Member

>>eccolo l'allegato.
>Vedo le due tabelle ma non capisco che relazione ci sia tra di
>loro...
>

è una relazione di uno molti da ID_archivio a mittente, e destinatario.

Ragazzi sinceramente non ho capito niente di questa query...
che significa quando scrivi dbo.nometabella?

Cmq ho provato ad utilizzarla direttamente sul web server, ma mi da errore...

lbenaglia Profilo | Guru

>ma la query che ho proposto va bene per access??

Access non ha il concetto di owner (schema) quindi dbo non ci vuole.
Per il resto non ne ho idea dato che non ho capito niente di quali siano le esigenze del nostro amico

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

zseven Profilo | Senior Member

cerco di spiegarmi meglio.

Immagina che nella tabella tab_contatti ci sia un solo record.
Nei campi MITTENTE e DESTINATARIO ho il valore dell'ID che recupero dalla tabella tab_archivio.
Quindi se nella tabella tab_archivio ho due record rispettivamente di questo tipo:
ID_archivio | ragione
1 | MARIO
2 | ANTONIO

Se Mario ha mandato una comunicazione ad Antonio nella tabella tab_contatti avrò una situazione di questo tipo:

MITTENTE | DESTINATARIO
1 | 2

Viceversa se è stato Antonio a mandare una comunicazione a Mario avrò il contrario.
Io inpratica invece di visualizzare i valori "1" e "2" vorrei visualizzare il valore ragione collegato, cioè Mario ed Antonio.
Spero di essere stato un pò piu chiaro questa volta.

Riuscita ad aiutarmi?
Grazie mille

lbenaglia Profilo | Guru

>Immagina che
Perché devo immaginare? Non puoi postare un mdb con questi dati?

>Io inpratica invece di visualizzare i valori "1" e "2" vorrei
>visualizzare il valore ragione collegato, cioè Mario ed Antonio.
>Spero di essere stato un pò piu chiaro questa volta.
Mica tanto, la query che diavolo di result set deve restituire?!

Boh, secondo me una ipotetica soluzione potrebbe essere questa:

SELECT A1.Ragione AS Mittente , A2.Ragione AS Destinatario FROM (tab_archivio AS A1 INNER JOIN tab_contatti AS C ON A1.ArchivioID = C.Mittente) INNER JOIN tab_archivio AS A2 ON A2.ArchivioID = C.Destinatario;

In allegato trovi l'mdb completo.
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

bluland Profilo | Guru

ALDILA degli owner ora faccio vedere il risultato di questa query su una tabella di db sql cosi, il nostro amico mi dice se ho capito e magari Lorenzo puo' dare un aiuto su ACCESS:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

fammi sapere

saluti

VP


zseven Profilo | Senior Member

sì il risultato deve essere una cosa del genere:

-- results
DEST MITT OGGETTO
-------------------------------------------------- -------------------------------------------------- --------------------------------------------------
Vincenzo Rossi Rosario Albano Prima connessione
Rosario Albano Vincenzo Rossi Seconda connessione
Rosario Albano Vincenzo Rossi Terza connessione


>>Immagina che
>Perché devo immaginare? Non puoi postare un mdb con questi dati?

Beh ma te l'ho postato il database lorenzo. Manca solo la semplice relazione uno a molti tra ID_archivio e mittente, e tra ID_archivio e destinatario.
Nel database ci sono piu dati in tab_Archivio, mentre in tab_contatti c'è un solo record.
Quello che ho scritto io era solo per semplificare la questione.

>>Io inpratica invece di visualizzare i valori "1" e "2" vorrei
>>visualizzare il valore ragione collegato, cioè Mario ed Antonio.
>>Spero di essere stato un pò piu chiaro questa volta.
>Mica tanto, la query che diavolo di result set deve restituire?!
>
>Boh, secondo me una ipotetica soluzione potrebbe essere questa:
>
>SELECT
> A1.Ragione AS Mittente
> , A2.Ragione AS Destinatario
>FROM (tab_archivio AS A1
>INNER JOIN tab_contatti AS C
>ON A1.ArchivioID = C.Mittente)
>INNER JOIN tab_archivio AS A2
>ON A2.ArchivioID = C.Destinatario;
>
>In allegato trovi l'mdb completo.

Non è proprio il risultato che dovrei avere.
Vedi Lorenzo il mio result non deve essere altro che quello che sta nella tabella tab_contatti, con l'unica differenza che invece dei valori numeri che stanno in Mittente e Destinatario devo visualizzare il valore ragione collegato a tale valore numerico.
Con la query che mihai dato tu invece ottengo un valore per ogni record presente in tab_archivio.

Grazie

lbenaglia Profilo | Guru

>Non è proprio il risultato che dovrei avere.
>Vedi Lorenzo il mio result non deve essere altro che quello che
>sta nella tabella tab_contatti, con l'unica differenza che invece
>dei valori numeri che stanno in Mittente e Destinatario devo
>visualizzare il valore ragione collegato a tale valore numerico.
>Con la query che mihai dato tu invece ottengo un valore per ogni
>record presente in tab_archivio.

Non avevo capito.
La query che cerchi è identica alla precedente con l'aggiunta delle colonne mancanti:

SELECT C.ID_contatti , C.id_protocollo , C.id_direzione , A1.Ragione AS Mittente , A2.Ragione AS Destinatario , C.oggetto , C.messaggio , C.allegato , C.data , C.orario , C.letto FROM (tab_archivio AS A1 INNER JOIN tab_contatti AS C ON A1.ID_Archivio = C.Mittente) INNER JOIN tab_archivio AS A2 ON A2.ID_Archivio = C.Destinatario;

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

zseven Profilo | Senior Member

Perfetto.
Grazie mille per la pazienza.
Mi rendo conto che per voi che aiutate è sempre difficile comprendere i nostri ragionamenti astrusi!!!

Ciao
Guido
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