Just to make sure I understood the Intersect/Except operators, I tried a variation of the examples from BOL. I put debug(s) around it all just to run various tests without having to re-generate the TEMP tables all the time:
DECLARE @DEBUG INT;
SET @DEBUG = 1;
IF (@DEBUG = 0)
BEGIN
CREATE TABLE #TableA (col1 int);
CREATE TABLE #TableB (col1 int);
CREATE TABLE #TableC (col1 int);
INSERT INTO #TableA
SELECT NULL UNION
SELECT 1 UNION
SELECT 2 UNION
SELECT 2 UNION
SELECT 2 UNION
SELECT 2 UNION
SELECT 3 UNION
SELECT 4 UNION
SELECT 4;
INSERT INTO #TableA VALUES (NULL);
INSERT INTO #TableA VALUES (NULL);
INSERT INTO #TableB
SELECT NULL UNION
SELECT 1 UNION
SELECT 3 UNION
SELECT 4 UNION
SELECT 4;
INSERT INTO #Tablec
SELECT 2 UNION
SELECT 2 UNION
SELECT 2 UNION
SELECT 4 UNION
SELECT 4;
SELECT * from #TableA;
SELECT * FROM #TableB;
SELECT * FROM #TableC;
END;
IF (@Debug = 1)
BEGIN
SELECT col1
FROM #TableA
EXCEPT
SELECT col1 FROM #TableB;
SELECT A.Col1
FROM #TableA A
LEFT OUTER JOIN #TableB B
ON A.Col1 = B.Col1
WHERE B.Col1 IS NULL;
SELECT *
FROM #TableA
INTERSECT
SELECT * FROM #TableB;
SELECT A.Col1
FROM #TableA A
INNER JOIN #TableB B
ON A.Col1 = B.Col1
END
IF (@DEBUG = 10)
DROP TABLE #TableA, #TableB, #TableC;
All of the results here are as expected. But that still leaves the questions as to why the first tests had differences..... 🙁
Argue for your limitations, and sure enough they're yours (Richard Bach, Illusions)