Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

left outer join a più tabelle

476 views
Skip to first unread message

Massimo Galioto

unread,
Dec 19, 2009, 4:34:09 AM12/19/09
to
salve a tutti!

ho un problemino che mi affligge da qualche giorno
non riesco a capire come strutturare una query con più join interni.

in sostanza ho 4 tabelle Tabella1, Tabella2 sono in relazione 1 a 1
tra di loro (tabella 1 e tabella 2 hanno valori univoci ma potrebbero
esserci dati in tabella 2 che non sono presenti in tabella1 e
viceversa)
tabella 3 e tabella 4 in realazione 1 a 1 tra di loro

tra tabella 2 e tabella 3 c'è una realazione 1 a n

vorrei realizzare una query che mi restituisca tutti i record di
tabella 1 e se ci sono i dati di tabella 2 altrimenti null
in più il primo dato, se esiste, di tabella 3 e 4 secondo un certo
criterio altrimenti null

sarei più contento se mi deste una spiegazione sul come fare non solo
il codice

grazie
max

Luca Bianchi

unread,
Dec 19, 2009, 7:22:01 AM12/19/09
to
> vorrei realizzare una query che mi restituisca tutti i record di
> tabella 1 e se ci sono i dati di tabella 2 altrimenti null

Fin qui �

FROM tabella1 LEFT JOIN tabella2 ON condizione_di_join

> in pi� il primo dato, se esiste, di tabella 3

adesso devi dare una definizione di "il primo dato di tabella 3". In base a
quale criterio? Se ad esempio in base ad una data (quindi prendendo quello
con la data pi� bassa) farei una query simile a

SELECT campo, MIN(data)
FROM tabella3
GROUP BY campo

dove campo � il "criterio" che lega questa tabella alle altre 2. Legando
quindi il risultato di cui sopra con questo qui la clausola FROM diventa
simile a

FROM (tabella1 LEFT JOIN tabella2 ON condizione_di_join)
LEFT JOIN (SELECT campo, MIN(data) AS data
FROM tabella3
GROUP BY campo) AS T3 ON condizione_di_join


> e 4 secondo un certo
> criterio altrimenti null

come sopra

> sarei pi� contento se mi deste una spiegazione sul come fare non solo
> il codice

La spiegazione deriva dalla descrizione di quello che vuoi fare. Tanto pi�
riesci a descrivere verbalmente l'attivit� da eseguire e tanto pi� semplice
diventa tradurre il tutto in T-SQL...

> grazie
> max

Bye

--
Luca Bianchi
Microsoft MVP - SQL Server

VeroToad [MVP]

unread,
Dec 19, 2009, 7:27:47 AM12/19/09
to
Massimo Galioto ha scritto:

> salve a tutti!
> ho un problemino che mi affligge da qualche giorno
> non riesco a capire come strutturare una query con piᅵ join interni.

> in sostanza ho 4 tabelle Tabella1, Tabella2 sono in relazione 1 a 1
> tra di loro (tabella 1 e tabella 2 hanno valori univoci ma potrebbero
> esserci dati in tabella 2 che non sono presenti in tabella1 e
> viceversa)
> tabella 3 e tabella 4 in realazione 1 a 1 tra di loro
> tra tabella 2 e tabella 3 c'ᅵ una realazione 1 a n

Era molto piᅵ semplice (e molto piᅵ "in sostanza") se avessi
direttamente scritto gli script di CREATE TABLE :-) con magari qualche
dato (INSERT INTO) dentro...

Vediamo un po':

USE TempDB
GO

CREATE TABLE Tabella1
(
ChiaveT1 int PRIMARY KEY,
CampoT1_1 nvarchar(100),
CampoT1_2 nvarchar(100)
)

CREATE TABLE Tabella2
(
ChiaveT2 int PRIMARY KEY
REFERENCES Tabella1(ChiaveT1),
CampoT2_1 nvarchar(100),
CampoT2_2 nvarchar(100)
)

CREATE TABLE Tabella3
(
ChiaveT3 int PRIMARY KEY,
T2Key int
REFERENCES Tabella2(ChiaveT2),
CampoT3_1 nvarchar(100),
CampoT3_2 nvarchar(100)
)

CREATE TABLE Tabella4
(
ChiaveT4 int PRIMARY KEY
REFERENCES Tabella3(ChiaveT3),
CampoT4_1 nvarchar(100),
CampoT4_2 nvarchar(100)
)

> vorrei realizzare una query che mi restituisca tutti i record di
> tabella 1 e se ci sono i dati di tabella 2 altrimenti null

> in piᅵ il primo dato, se esiste, di tabella 3 e 4 secondo un certo
> criterio altrimenti null

Partiamo dall'inizio:
1) Restituire tutti i record di Tabella1 e se ci sono dati in tabella
2, altrimenti null (interpreto che i campi relativi in Tabella 2
saranno valorizzati a null)
E' una left (outer) join tra Tabella 1 e Tabella 2:

SELECT T1.CampoT1_1, T1.CampoT1_2, T2.CampoT2_1, T2.CampoT2_2
FROM Tabella1 T1
LEFT JOIN Tabella2 T2
ON T1.ChiaveT1=T2.ChiaveT2

2) in piᅵ il primo dato, se esiste, di tabella 3 e 4 secondo un certo
criterio altrimenti null
Mmm... Mi vengono in mente diversi approcci, tutti in funzione perᅵ del
"certo criterio". Qual ᅵ il criterio? Potresti darci dei dati concreti?

HTH
Ciao!

--
Simone Viganᅵ AKA VeroToad - MVP Windows Desktop Experience
My blog: http://blogs.dotnethell.it/VeroToad
RIO (Risorse in italiano per utenti di Office): http://www.riolab.org


0 new messages