This discussion came up on Twitter so I thought I’d blog about it. UPDATE FROM (sometimes called an UPDATE JOIN) is an language construct that is an extension to the ANSI-92 standard supported by several DBMS’s, but not by Oracle. I first discovered this when doing some ETL work in SSIS with an Oracle destination. The Oracle DBA’s answer was to use a cursor, which admittedly has much less of a performance impact in Oracle than it does in SQL Server. But my set-based brain just couldn’t deal with that. So I went digging and discovered a set-based method to use in Oracle to accomplish the same thing.
The following two code snippets show how I would accomplish the same thing in both T-SQL and in Oracle.
T-SQL
update t1 set
t1.col2 = t2.col2
from t1
inner join t2 on t1.col1 = t2.col1;
Oracle
update
(select
t2.col2 as src_2,
t2.col2 as tgt_2
from t1
inner join t2 on t1.col1 = t2.col1
)
set tgt_2 =src_2;
As you can see, the set-based Oracle version would become quite verbose if you’re dealing with a lot of columns. Also, Oracle requires the subquery to return unique rows, which makes me wonder if it isn’t using a cursor under the hood anyway.