LOGICA FUNZIONAMENTO FULL OUTER

mercoledì 11 ottobre 2006 - 09.28

gmt Profilo | Junior Member

Salve, avevo già proposto una cosa analoga e avevo risolto (grazie a Benaglia) con la FULL OUTER JOIN.. pero'...

SQL Server 2000/2005

Date le tre tabelle di sotto (relazionate tramite Campo1)

T1
Campo1 Campo2
12 100
11 45
13 66
22 333

T2
Campo1 Campo2
12 145
11 41
13 67
17 87


T3
Campo1 Campo2
12 122
11 56
17 84
22 312

devo ottenere

T1
Campo1 T1.Campo2 T2.Campo2 T3.Campo2
12 100 145 122
11 45 41 56
13 66 67 NULL
17 NULL 87 84
22 333 NULL 312

con due tabelle non ho problemi con 3 o piu' di tre il problema si genera perche' se relaziono la T1 con T2 e T2 con T3 il codice del Campo1 si presenta su due righe diverse..
Sto pensando di relazionare T1 con T2 e create T1TEMP e poi relazionare T1TEMP con T3.. ma dovendo fare questo da codice e non sapendo il numero di tabelle sto impazzendo..
Sbaglio qualcosa? C'è rimedio?

Grazie mille a tutti.

lbenaglia Profilo | Guru

>Date le tre tabelle di sotto (relazionate tramite Campo1)
Che significa? Che relazioni intercorrono tra le tabelle?
Posta i comandi CREATE TABLE comprensivi di constraint e già che ci sei i comandi di INSERT per popolarle.

>Grazie mille a tutti.
Prego.

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

grancati Profilo | Newbie

Ciao gmt,

puoi fare così:
----
Select Coalesce(T1.Campo1,T2.Campo1,T3.Campo1) AS Campo1,
T1.Campo2,T2.Campo2,T3.Campo2
From T1
Full join
T2 on T1.Campo1=T2.Campo1
Full Join
T3 ON Coalesce(T1.Campo1,T2.Campo1) = T3.Campo1
----

Ciao
Giorgio

gmt Profilo | Junior Member

Parliamo di SQL Server 2000/2005

CREATE TABLE TAB1 (CAMPO1 CHAR(10), CAMPO2 INT);
CREATE TABLE TAB2 (CAMPO1 CHAR(10), CAMPO2 INT);
CREATE TABLE TAB3 (CAMPO1 CHAR(10), CAMPO2 INT);

INSERT INTO TAB1 VALUES (10, 1003);
INSERT INTO TAB1 VALUES (20, 1123);
INSERT INTO TAB1 VALUES (30, 1345);
INSERT INTO TAB1 VALUES (40, 1456);

INSERT INTO TAB2 VALUES (20, 2322);
INSERT INTO TAB2 VALUES (30, 2112);
INSERT INTO TAB2 VALUES (50, 2563);
INSERT INTO TAB2 VALUES (60, 2879);

INSERT INTO TAB3 VALUES (10, 3422);
INSERT INTO TAB3 VALUES (20, 3812);
INSERT INTO TAB3 VALUES (50, 3983);
INSERT INTO TAB3 VALUES (90, 3998);

Non esiste una relazione fisica tra le tabelle ma è il CAMPO1 che fa da chiave.

Il risultato di una singola query dovrebbe essere il seguente:

CAMPO1 T1.CAMPO2 T2.CAMPO2 T3.CAMPO2
10 1003 - 3422
20 1123 2322 -
30 1345 2112 -
40 1456 - -
50 - 2563 3983
60 - 2879 -
90 - - 3998

Grazie mille in anticipo.

gmt Profilo | Junior Member

Giorgio, grazie.. ma non funziona la colonna per la terza tabella è uguale alla seconda.

lbenaglia Profilo | Guru

>Giorgio, grazie.. ma non funziona la colonna per la terza tabella
>è uguale alla seconda.

La query di Giorgio funziona alla perfezione:

USE tempdb; GO CREATE TABLE dbo.tab1 (Campo1 int, Campo2 int); CREATE TABLE dbo.tab2 (Campo1 int, Campo2 int); CREATE TABLE dbo.tab3 (Campo1 int, Campo2 int); GO INSERT INTO dbo.tab1 VALUES (10, 1003); INSERT INTO dbo.tab1 VALUES (20, 1123); INSERT INTO dbo.tab1 VALUES (30, 1345); INSERT INTO dbo.tab1 VALUES (40, 1456); INSERT INTO dbo.tab2 VALUES (20, 2322); INSERT INTO dbo.tab2 VALUES (30, 2112); INSERT INTO dbo.tab2 VALUES (50, 2563); INSERT INTO dbo.tab2 VALUES (60, 2879); INSERT INTO dbo.tab3 VALUES (10, 3422); INSERT INTO dbo.tab3 VALUES (20, 3812); INSERT INTO dbo.tab3 VALUES (50, 3983); INSERT INTO dbo.tab3 VALUES (90, 3998); GO SELECT COALESCE(T1.Campo1, T2.Campo1, T3.Campo1) AS Campo1 , T1.Campo2 AS T1_Campo2 , T2.Campo2 AS T2_Campo2 , T3.Campo2 AS T3_Campo2 FROM dbo.tab1 AS T1 FULL JOIN dbo.tab2 AS T2 ON T1.Campo1 = T2.Campo1 FULL JOIN dbo.tab3 AS T3 ON COALESCE(T1.Campo1, T2.Campo1) = T3.Campo1; GO /* Output: Campo1 T1_Campo2 T2_Campo2 T3_Campo2 ----------- ----------- ----------- ----------- 10 1003 NULL 3422 20 1123 2322 3812 30 1345 2112 NULL 40 1456 NULL NULL 50 NULL 2563 3983 60 NULL 2879 NULL 90 NULL NULL 3998 (7 row(s) affected) */ DROP TABLE dbo.tab1, dbo.tab2, dbo.tab3;

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

gmt Profilo | Junior Member

Sono un Pirlone.. avevo invertito un T2 con T3.

MEGA GRAZIE!

gmt Profilo | Junior Member

Scusami, funziona e come..

GRAZIE INFINITE!
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