Jeff's SQL Server Blog

Random Thoughts & Cartesian Products with Microsoft SQL Server
posts - 149, comments - 1983, trackbacks - 64

My Links

SQLTeam.com Links

News

Welcome to my weblog. My name is Jeff Smith, and I am a software developer in Boston, MA. Check in frequently for tips, tricks, commentary and ideas on SQL Server and .NET programming.


Subscribe





Archives

Post Categories

Programming

Sports

SQL

SQL Server 2005: Using EXCEPT and INTERSECT to compare tables

Previously, I had written that UNION ALL (combined with a GROUP BY) is a really quick and easy way to compare two tables.  You don't need to worry about NULLS, the code is fairly short and easy to follow, and you can view exceptions from both tables at the same time.

Well, now in SQL 2005, we have another option:  using EXCEPT and INTERSECT.  And these are even easier!

To return all rows in table1 that do not match exactly the rows in table2, we can just use EXCEPT like this:

select * from table1 except select * from table2

To return all rows in table2 that do not match exactly in table1, we reverse the EXCEPT:

select * from table2 except select * from table1

And to return all rows in table1 that match exactly what is in table2, we can use INTERSECT:

select * from table1 intersect select * from table2

In all of the above examples, the columns must match between the two tables, of course.

Thus, we can return a listing of all rows from either table that do not match completely by using UNION ALL to combine the results of both EXCEPT queries:

select 'table1' as tblName, *  from
  (select * from table1
   except
  
select * from table2) x

union all
select 'table2' as tblName, *  from
  (select * from table2
   except
select * 
   from table1) x


And we can now write a very simple stored procedure that compares any two tables (assuming the schemas match, of course) like this:

create procedure CompareTables @table1 varchar(100), @table2 varchar(100)
as
  declare @sql varchar(8000)
  set @sql = 'select ''' + @table1 + ''' as tblName, *  from
      (select * from ' + @table1 + '
       except
       select * from ' + @table2 + ') x
    union all
    select ''' + @table2 + ''' as tblName, *  from
      (select * from ' + @table2 + '
       except
       select *
from ' + @table1 +') x'

  exec(@sql)

Of course, both tables must have primary keys in place; duplicate values in these tables will not make logical sense when trying to determine which rows match or not.

So, EXCEPT and INTERSECT are pretty handy.  Does anyone else have any suggestions for ideas where these operators can make things shorter, quicker or more efficient compared to older (pre SQL 2005) methods?

see also:

Print | posted on Wednesday, May 02, 2007 2:47 PM

Feedback

# re: SQL Server 2005: Using EXCEPT and INTERSECT to compare tables

Hi I know that SQL2k has the same functions named EXCEPT and INTERSECT... just they are declared differently. Except(«Set1», «Set2»[, ALL]) and Intersect(«Set1», «Set2»[, ALL]).

My question is can this concept be modified to work in SQL2K or is this just something for 2k5? Currently we use unions for large data comparisons to return a result in our application. I'm wondering if it will help speed them up by using these functions.
5/7/2007 10:00 AM | John Kandrovy

# re: SQL Server 2005: Using EXCEPT and INTERSECT to compare tables

thanks.Very useful Notes
7/20/2007 5:12 AM | Rachana

# re: SQL Server 2005: Using EXCEPT and INTERSECT to compare tables

I need to compare records in two different table and need to set status about any un matched records in two different table
12/7/2007 4:30 AM | Faiz Shaikh

# re: SQL Server 2005: Using EXCEPT and INTERSECT to compare tables

I need to compare two or more then two columns of two different tables and need to show those records which are not matched.
12/7/2007 4:46 AM | Faizan

# re: SQL Server 2005: Using EXCEPT and INTERSECT to compare tables

Really helpful for me
for comparing the exact columns we can add the coluimns name instead of *
is that select column name1,column name 2 ...........

is this correct?

- Santosh K
2/19/2008 4:21 AM | santosh k

# re: SQL Server 2005: Using EXCEPT and INTERSECT to compare tables

Cool........It saved a lot of time for me. I was looking for something like this and it came nicely to me......

Good work.

Just a short explanation: We can use column names for duplicate check.

I used it where i wanted to compare values of two tables TableA and TableB and insert new rows in TableA if the row exist in TableB but not in TableA. I was thinking to create a temp table but now i need not to........

Thanks a lot.
3/4/2008 4:31 PM | S

# re: SQL Server 2005: Using EXCEPT and INTERSECT to compare tables

Thank you Thank you Thank you Thank you Thank you Thank you Thank you Thank you !!!!!!!!!!!!!!

HUGE time saver
7/23/2008 2:31 AM | Paul

Post Comment

Title  
Name  
Email
Url
Comment   
Please add 8 and 7 and type the answer here:

Powered by: