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