UNIRE DUE QUERY (SENZA UNION)

lunedì 18 settembre 2006 - 15.23

gmt Profilo | Junior Member

Salve,
non so se è possibile ma vi pongo questo quesito prima di inziare a scrivere il codice che lo fa!
Ho due tabelle

TABELLA 1
CODICE VALORE1 VALORE2
12 100 200
17 87 56
21 178 167

TABELLA 2
CODICE VALORE1 VALORE2
12 103 230
17 82 55
19 12 45

Vorrei una query che dasse il seguente risultato
TABELLA RISULTATO
CODICE TABELLA1.VALORE1 TABELLA1.VALORE2 TABELLA2.VALORE1 TABELLA2.VALORE2
12 100 200 103 230
17 87 56 82 55
21 178 167 NULL NULL
19 NULL NULL 12 45

Grazie

cldparisi Profilo | Newbie

select
isnull(tb1.codice,tb2.codice),
tb1.valore1,
tb1.valore2,
tb2.valore1,
tb2.valore2
from tb1 full outer join tb2
on tb1.codice=tb2.codice

alx_81 Profilo | Guru

>Salve,
Ciao!

>non so se è possibile ma vi pongo questo quesito prima di inziare
>a scrivere il codice che lo fa!
>Ho due tabelle
>
>TABELLA 1
>CODICE VALORE1 VALORE2
>12 100 200
>17 87 56
>21 178 167
>
>TABELLA 2
>CODICE VALORE1 VALORE2
>12 103 230
>17 82 55
>19 12 45
>
>Vorrei una query che dasse il seguente risultato
>TABELLA RISULTATO
>CODICE TABELLA1.VALORE1 TABELLA1.VALORE2 TABELLA2.VALORE1
>TABELLA2.VALORE2
>12 100 200
>103 230
>17 87 56
>82 55
>21 178 167
>NULL NULL
>19 NULL NULL
>12 45
>
Sì, è possibile, si usa la full outer join, come segue:

if exists(select * from sysobjects where id = object_id('Tabella1')) drop table Tabella1 if exists(select * from sysobjects where id = object_id('Tabella2')) drop table Tabella2 -- creo e popolo le tabelle create table Tabella1 ( CODICE int, VALORE1 int, VALORE2 int ) insert into Tabella1 values (12,100,200) insert into Tabella1 values (17,87,56) insert into Tabella1 values (21,178,167) create table Tabella2 ( CODICE int, VALORE1 int, VALORE2 int ) insert into Tabella2 values (12,103,230) insert into Tabella2 values (17,82,55) insert into Tabella2 values (19,12,45) -- eseguo la query in full outer join select * from Tabella1 a full outer join Tabella2 b on a.codice = b.codice

>Grazie
>

Di nulla.
Ciao!

Alx81 =)

http://blogs.dotnethell.it/suxstellino

lbenaglia Profilo | Guru

>non so se è possibile ma vi pongo questo quesito prima di inziare
>a scrivere il codice che lo fa!

Ciao gmt,

Quando posti un quesito è opportuno specificare il DBMS utilizzato.
Io ti proporrò una soluzione per SQL Server.
Quello di cui hai bisogno è di una FULL OUTER JOIN, ovvero una particolare OUTER JOIN che considera tutte le righe di entrambe le tabelle, indipendentemente dal match tra le colonne specificate nella clausola ON:
USE tempdb; GO CREATE TABLE dbo.Tabella1( Codice tinyint NOT NULL PRIMARY KEY, Valore1 tinyint NOT NULL, Valore2 tinyint NOT NULL ); GO CREATE TABLE dbo.Tabella2( Codice tinyint NOT NULL PRIMARY KEY, Valore1 tinyint NOT NULL, Valore2 tinyint NOT NULL ); GO INSERT dbo.Tabella1 VALUES(12, 100, 200); INSERT dbo.Tabella1 VALUES(17, 87, 56); INSERT dbo.Tabella1 VALUES(21, 178, 167); INSERT dbo.Tabella2 VALUES(12, 103, 230); INSERT dbo.Tabella2 VALUES(17, 82, 55); INSERT dbo.Tabella2 VALUES(19, 12, 45); GO SELECT COALESCE(T1.Codice, T2.Codice) AS Codice , T1.Valore1 , T1.Valore2 , T2.Valore1 , T2.Valore2 FROM dbo.Tabella1 AS T1 FULL JOIN dbo.Tabella2 AS T2 ON T1.Codice = T2.Codice; GO /* Output: Codice Valore1 Valore2 Valore1 Valore2 ------ ------- ------- ------- ------- 12 100 200 103 230 17 87 56 82 55 19 NULL NULL 12 45 21 178 167 NULL NULL (4 row(s) affected) */ DROP TABLE dbo.Tabella1, dbo.Tabella2;

Come puoi notare ho utilizzato la funzione COALESCE per valorizzare la colonna Codice anche nel caso in cui T1.Codice sia NULL (caso che si verifica quando vengono prese le righe di T2 non presenti in T1).

Per maggiori dettagli leggi i seguenti paragrafi dei Books Online:

"Using Outer Joins"
http://msdn2.microsoft.com/en-us/library/ms187518.aspx

"COALESCE (Transact-SQL)"
http://msdn2.microsoft.com/en-US/library/ms190349.aspx

>Grazie
Prego.

Ciao!

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

gmt Profilo | Junior Member



Salve,
parliamo di SQL Server 2000/2005

non ho avuto problemi con la FULL OUTER JOIN, finchè non ho avuto necessita di collegare una terza tabella..
la relazione è su 3 campi (DATA, ANOMALIA, TIPO) ho messo un 1=1 xchè faccio la query da programma.
La terza tabella la relaziono con la seconda (o con la prima) ma se nella seconda (o prima) un record non lo trova moltiplica i record.

31/03/2005 02-Rigidità di utilizzo NUM 0 0 0 0 6 0,43
31/03/2005 02-Rigidità di utilizzo NUM 3 0,9 0 0 0 0
31/03/2005 02-Rigidità di utilizzo IMP 58913 0,69 0 0 0 0
31/03/2005 02-Rigidità di utilizzo IMP 0 0 0 0 151472 0,93

riporto anche la query

SELECT COALESCE (tmp_confronto_admin1.DATA, tmp_confronto_admin2.DATA, tmp_confronto_admin3.DATA) AS DATA,
COALESCE (tmp_confronto_admin1.ANOMALIA, tmp_confronto_admin2.ANOMALIA, tmp_confronto_admin3.ANOMALIA) AS ANOMALIA,
COALESCE (tmp_confronto_admin1.TIPO, tmp_confronto_admin2.TIPO, tmp_confronto_admin3.TIPO) AS TIPO, ISNULL(tmp_confronto_admin1.TOTALI,
0) AS [TOTALI (1)], ISNULL(tmp_confronto_admin1.[%], 0) AS [% (1)], ISNULL(tmp_confronto_admin2.TOTALI, 0) AS [TOTALI (2)],
ISNULL(tmp_confronto_admin2.[%], 0) AS [% (2)], ISNULL(tmp_confronto_admin3.TOTALI, 0) AS [TOTALI (3)], ISNULL(tmp_confronto_admin3.[%], 0)
AS [% (3)]
FROM tmp_confronto_admin1 FULL OUTER JOIN
tmp_confronto_admin2 ON 1 = 1 AND tmp_confronto_admin1.DATA = tmp_confronto_admin2.DATA AND
tmp_confronto_admin1.ANOMALIA = tmp_confronto_admin2.ANOMALIA AND
tmp_confronto_admin1.TIPO = tmp_confronto_admin2.TIPO FULL OUTER JOIN
tmp_confronto_admin3 ON 1 = 1 AND tmp_confronto_admin2.DATA = tmp_confronto_admin3.DATA AND
tmp_confronto_admin2.ANOMALIA = tmp_confronto_admin3.ANOMALIA AND tmp_confronto_admin2.TIPO = tmp_confronto_admin3.TIPO
ORDER BY tmp_confronto_admin1.ANOMALIA

spero abbia illustrato bene il problema.. sto cercando di risolvere da solo ma ho difficoltà..
Premetto che mi creo le tabelle tmp_confronto_admin da progamma e poi creo la query (sopra) sempre da programma..

Grazie
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