Remove only the records that don't don't exist before Update - SQL Server 2005

Hello Experts,

I am updating Table2 from Table1 with the following synatax:

UPDATE Table2
SET col1 = t1.col1, col2 = t1.col2, col3 = t1.col3
FROM Table1 t1 INNER JOIN
    Table2 t2 ON t1.ID = t2.ID

This works great to update existing records...

I would like to remove any records in Table2 that do not exist in Table1 before the update.

In other words: Table1 will always be the full record range of Table2 unless there was a record removed from Table1. I always want to make sure that deleted records from Table1 are also deleted in Table2 upoh each update.

Does anyone know how to do this?

Thanks!



SaxitalisAsked:
Who is Participating?
 
Kevin CrossChief Technology OfficerCommented:
This is one method using where clause.
DELETE FROM Table2
WHERE NOT EXISTS (SELECT 1 FROM Table1 WHERE Table1.ID = Table2.ID)

Open in new window

0
 
Cvijo123Commented:
or u can use this statment


Delete Table2
from Table2 t2
right join Table1 t1
	on t2.ID = t1.ID
where 
 t2.ID is null

Open in new window

0
 
Kevin CrossChief Technology OfficerCommented:
You have that backwards, Cvijo123.

I was going to suggest a join earlier, but since you did just want to make sure it is correct one.

Table2 in this case has more records because you deleted from Table1, so you want a LEFT JOIN where t1.ID IS NULL.
Delete Table2
from Table2 t2
left join Table1 t1
	on t2.ID = t1.ID
where 
 t1.ID is null

Open in new window

0
Cloud Class® Course: Microsoft Exchange Server

The MCTS: Microsoft Exchange Server 2010 certification validates your skills in supporting the maintenance and administration of the Exchange servers in an enterprise environment. Learn everything you need to know with this course.

 
Kevin CrossChief Technology OfficerCommented:
@Cvijo123, welcome by the way!
0
 
SaxitalisAuthor Commented:
mwvisa1,
Is there a benefit to using a join ( your second example) as opposed to a NOT EXISTS (your first example)?

Thanks!
0
 
Cvijo123Commented:
@mwvisa1:  :) yes u are right, table2 need to match table1 from wich record is deleted so its left join and t1.id is null :)

tnx for welcome note :)
0
 
Kevin CrossChief Technology OfficerCommented:
Here is a good discussion on this: http://sql-server-performance.com/Community/forums/p/17162/100761.aspx

In a nutshell, I typically don't worry too much about the performance difference between the three methods as using a ID NOT IN (SELECT ID FROM Table1) is the other method as you will see some of the folks in the above don't either.  Technically some seem to favor the EXISTS/NOT EXISTS approach.  

I only mentioned the LEFT JOIN since join was suggested and was in incorrect syntax as I typically use what comes to mind that day. :) Probably bad of me to say, but it is the truth.
0
 
Kevin CrossChief Technology OfficerCommented:
On systems older than 2005, you can use the more scientific approaches like using Query Execution Plan or turning on STATISTICS and seeing which produces best results; however, for SQL 2005, I haven't noticed enough of a difference to choose one over the other exclusively.

I think a lot of times, I usually end up using the NOT IN method as I am usually do analysis of data in the one table like say Table1 and so I have a query for that already and so it is convenient to just through a query in front of it that says SELECT col1 FROM Table2 WHERE id IN (my original query).

Probably more information than you wanted to know, but I have no life and enjoy typing.
0
 
SaxitalisAuthor Commented:
Thank you Sir! - That was perfect
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.