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?

Improve company productivity with a Business Account.Sign Up

x
 
Kevin CrossConnect With a Mentor Chief 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
Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 
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.