SQL Server Except


EXCEPT is available in SQL Server starting with SQL Server 2008. EXCEPT returns distinct rows by comparing the results of two queries. EXCEPT returns distinct rows from the left (first) input query that aren’t output by the right (last) input query. The data and tables are sourced from Philip Burton’s SQL course at Udemy.com. Contrast how EXCEPT works with UNION and INTERSECT.

Consider the following t-SQL code.

select * from tblDepartment;

select * -- create a new table
into tblDepartmentNew
from tblDepartment  -- has 5 rows

delete from tblDepartmentNew where Department = 'HR';

select * from tblDepartment -- has 5 rows
except 
select * from tblDepartmentNew  -- has 4 rows
-- we should only see the HR department

Here are the results from SSMS.

So EXCEPT says give me all of the rows in the first table and then delete from that result set all of the matching rows in the second table. What if there was a row in the second table that was not in the fists table? That row simply gets ignored and is not part of the result set.

Duplicates

What if we have duplicates in the first table. We have added some data to the first table. There is a duplicate, namely HR, Bryn. Notice that the results eliminate the duplicate rows from the first table.

select * from tblDepartment;

select * -- create a new table
into tblDepartmentNew
from tblDepartment  -- has 7 rows with 2 sets of duplicates.

delete from tblDepartmentNew where Department = 'HR';

select * from tblDepartmentNew

select * from tblDepartment -- has 5 rows
except
select * from tblDepartmentNew;  -- has 4 rows
-- we should only see the HR department but the question is
-- do we get both rows? No we don't.

with cte as (
select * from tblDepartment -- has 5 rows
except
select * from tblDepartmentNew  -- has 4 rows
)
select * 
into tblDepartmentResult
from cte;

Here are the results from SSMS.