Problema di SELECT

mercoledì 02 dicembre 2009 - 12.31

igorbaldacci Profilo | Newbie

Salve a tutti, non so se mi sto perdendo io in un bicchiere d'acqua oppure se proprio l'argomento è complicato.

Ho una tabella "TRATTE", nella quale memorizzo le tratte "DA-->A"

[table_TRATTE]
IDTratta
IDCitta_DA
IDCitta_A

e una tabella "DESTINAZIONI" nella quale memorizzo i "nomi delle città".

[table_DESTINAZIONI]
IDCitta
NomeCitta

Le due tabelle sono in relazione tra loro, in particolare ho creato una relazione con i campi "IDCitta_DA"/"IDCitta" e "IDCitta_A"/"IDCitta", in modo che ho un'unica tabella dove memorizzo i nomi delle città e nella tabella delle tratte recupero l'ID di queste per memorizzare la tratta "Partenza-Arrivo". Dovrebbe venir fuori una cosa del genere:

[table_DESTINAZIONI]

IDCitta NomeCitta
-------- -------------
1 Roma
2 Milano
3 Torino

[Table_TRATTE]

IDTratta IDCitta_DA IDCitta_A
---------- ------------- -----------
1 1 2
2 1 3
3 2 3

Adesso devo fare la SELECT per recuperare le tratte in modo che compaiano i nomi delle città:

[SELECT]

DA A
------------ ----------
Roma Milano
Roma Torino
Milano Torino


Ho provato con la INNER JOIN ma non ci riesco proprio... Ci sono sempre riuscitò finchè ho avuto una sola relazione in gioco, ma in questo caso ho due relazioni che fanno riferimento alla stessa tabella e non so che fare.

Qualcuno mi può dare una mano su che strata seguire? Anche con google faccio fatica a cercare una argomento simile...

Grazie.
Igor

CrystalEye Profilo | Newbie

Anche io sono alle prime armi con le query.Che ne dici della seguente?

select fromDest.nomecitta as Da , toDest.nomeCitta as A from Destinazioni fromDest
inner join Tratte
on Tratte.IdCitta_Da=fromDest.IdCitta
inner join Destinazioni toDest
on toDest.IdCitta= Tratte.IdCitta_A

lbenaglia Profilo | Guru

>Ho provato con la INNER JOIN ma non ci riesco proprio... Ci sono
>sempre riuscitò finchè ho avuto una sola relazione in gioco,
>ma in questo caso ho due relazioni che fanno riferimento alla
>stessa tabella e non so che fare.

Ciao Igor,

Non devi fare altro che eseguire due JOIN con la tabella Destinazioni come nel seguente esempio:

USE tempdb; CREATE TABLE dbo.Destinazioni( IDCitta int NOT NULL PRIMARY KEY, NomeCitta varchar(10) NOT NULL ); CREATE TABLE dbo.Tratte( IDTratta int NOT NULL PRIMARY KEY, IDCitta_DA int NOT NULL, IDCitta_A int NOT NULL, CONSTRAINT FK_Tratte_Da FOREIGN KEY(IDCitta_DA) REFERENCES dbo.Destinazioni(IDCitta), CONSTRAINT FK_Tratte_A FOREIGN KEY(IDCitta_A) REFERENCES dbo.Destinazioni(IDCitta) ); INSERT dbo.Destinazioni VALUES (1, 'Roma') , (2, 'Milano') , (3, 'Torino'); INSERT dbo.Tratte VALUES (1, 1, 2) , (2, 1, 3) , (3, 2, 3); SELECT D1.NomeCitta AS Da , D2.NomeCitta AS A FROM dbo.Tratte AS T JOIN dbo.Destinazioni AS D1 ON T.IDCitta_DA = D1.IDCitta JOIN dbo.Destinazioni AS D2 ON T.IDCitta_A = D2.IDCitta; /* Output: Da A ---------- ---------- Roma Milano Roma Torino Milano Torino (3 row(s) affected) */ DROP TABLE dbo.Tratte, dbo.Destinazioni;

>Grazie.
Prego.

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

CrystalEye Profilo | Newbie

grazie per aver chiarito le idee anche a me

igorbaldacci Profilo | Newbie

GRAZIEEEEEE!!!
Ho capito perfettamente... io sbagliavo perchè tra le inner join mettevo un AND o un OR e non ne uscivo. Inceve semplicemente bastava mettere le inner join "a cascata".

Grazie mille ragazzi.

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