views:

101

answers:

2

Evening all,

Actually, it's night. About 11pm. My brain is shutting down and I need a bit of help so I can finish and go home :)

I have two tables - table a and table b. I need to update a field in table a with the value from a field in table b when two other fields match. The tables don't have a unique id for each record :(

Basically, I want to do this:

update a
set importantField = 
(select b.importantfield
from b
where a.matchfield = b.matchfield
and a.matchfield2 = b.matchfield2
)
where a.matchfield = b.matchfield
and a.matchfield2 = b.matchfield2

Or at least... I think that's what I want to do...

Can someone help me out, please?

+3  A: 

You can do this via a join in the update:

Update a
Set a.importantField = b.importantField
From a Join b 
  On a.matchfield = b.matchfield
  And a.matchfield2 = b.matchfield2
Nick Craver
You, Sir, are a genius....and I really am tired not to think of doing a join...I can now go home and it's all thanks to you! Give yourself a pat on the back :D
Cosmic Flame
@Cosmic: Glad it works for you...I had to double check this worked, spent too much time inside LINQ lately :)
Nick Craver
+2  A: 

Use:

UPDATE TABLE_A
   SET importantField = (SELECT b.importantfield
                           FROM TABLE_B b
                          WHERE b.matchfield = matchfield
                            AND b.matchfield2 = matchfield2) 

SQL Server doesn't support table aliases on the table being updated, but the above is a correlated query - those fields without the table alias b attached will serve values from TABLE_A because it doesn't have an alias.

The only issue beyond that is if there are multiple b.importantfield values for records with the matching records to TABLE_A. Use:

UPDATE TABLE_A
   SET importantField = (SELECT TOP 1 
                                b.importantfield
                           FROM TABLE_B b
                          WHERE b.matchfield = matchfield
                            AND b.matchfield2 = matchfield2) 

..but you should use an ORDER BY as well or you'll get any random b.importantfield value.

OMG Ponies
Thank you very much for taking the time to write me an answer. I didn't use your solution in the end but I want to thank you for it anyway. So thank you :)
Cosmic Flame