Post by Albe V°Basandosi, immagino, su una qualche chiave.
Al che, penso che un Left Outer Join con Is NULL come condizione su un
campo della tabella 'di destra' svolga le stesse funzioni.
Può comunque essere che il Minus sia più leggibile, o più performante,
qualora le due select siano particolarmente complesse...
Ciao Albe,
non conosco il funzionamento dell'operatore minus di Oracle, ma attenzione
che EXCEPT oltre ad aderire allo standard ANSI SQL si comporta diversamente
da una outer join dato che restituisce le righe *distinte* della tabella di
sinistra che non sono presenti in quella di destra (left anti semi join),
quindi sarebbe come una left outer join con la distinct:
USE tempdb;
GO
CREATE TABLE dbo.TableA(
Col1 int
);
GO
CREATE TABLE dbo.TableB(
Col1 int
);
GO
INSERT dbo.TableA VALUES(1);
INSERT dbo.TableA VALUES(2);
INSERT dbo.TableA VALUES(2);
INSERT dbo.TableA VALUES(2);
INSERT dbo.TableA VALUES(3);
INSERT dbo.TableA VALUES(4);
INSERT dbo.TableA VALUES(4);
INSERT dbo.TableB VALUES(1);
INSERT dbo.TableB VALUES(3);
INSERT dbo.TableB VALUES(4);
INSERT dbo.TableB VALUES(4);
GO
/* EXCEPT */
SELECT * FROM dbo.TableA
EXCEPT
SELECT * FROM dbo.TableB;
GO
/* Output:
Col1
-----------
2
(1 row(s) affected)
*/
/* LEFT OUTER JOIN */
SELECT A.*
FROM dbo.TableA AS A
LEFT JOIN dbo.TableB AS B
ON A.Col1 = B.Col1
WHERE B.Col1 IS NULL;
GO
/* Output:
Col1
-----------
2
2
2
(3 row(s) affected)
*/
/* DISTINCT LEFT OUTER JOIN */
SELECT DISTINCT A.*
FROM dbo.TableA AS A
LEFT JOIN dbo.TableB AS B
ON A.Col1 = B.Col1
WHERE B.Col1 IS NULL;
GO
/* Output:
Col1
-----------
2
(1 row(s) affected)
*/
DROP TABLE dbo.TableA, dbo.TableB;
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org