Ciao Lorenzo,
Supergimi:
ho due tabelle identiche e devo individuare i record presenti in una delle tue tabelle e non nell'altra e viceversa.
Praticamente l'opposto della INNER JOIN.
Non ho mai avuto l'occasione di provare EXCEPT e INTERSECT su grandi quantità di dati per verificarne le performance, comunque perchè non utilizzi una LEFT OUTER JOIN come nell'esempio seguente ?
use [tempdb];
go
if object_id('dbo.TabellaA', 'U') is not null
drop table dbo.TabellaA;
go
create table dbo.TabellaA
(
id int identity(1, 1) not null primary key (id)
,colonna varchar(20)
)
go
if object_id('dbo.TabellaB', 'U') is not null
drop table dbo.TabellaB;
go
create table dbo.TabellaB
(
id int identity(1, 1) not null primary key (id)
,colonna varchar(20)
)
go
insert into dbo.TabellaA
(colonna)
values
('A'), ('B'), ('C');
go
insert into dbo.TabellaB
(colonna)
values
('A'), ('D'), ('E')
go
SELECT tabellaA.colonna, 'Solo_in_A' from dbo.TabellaA
LEFT JOIN dbo.TabellaB on TabellaA.colonna = TabellaB.colonna
WHERE (TabellaB.colonna is Null)
UNION
SELECT TabellaB.colonna, 'Solo_in_B' from dbo.TabellaB
LEFT JOIN dbo.TabellaA on TabellaB.colonna = TabellaA.colonna
WHERE (TabellaA.colonna is null);
Con i dati di prova inseriti avresti questo output:
colonna
-------------------- ---------
B Solo_in_A
C Solo_in_A
D Solo_in_B
E Solo_in_B
L'indice sulla colonna "colonna" sia in dbo.TabellaA che in dbo.TabellaB è altamente consigliato
.
Ciao!
Sergio Govoni, SQL Server MVP |
MVP Profile |
Blog |
Twitter |