update ud set assid = ( select sale.assid from sale where sale.udid = ud.id ) whereexists ( select* from sale where sale.udid = ud.id );
SQL Server方法
1 2 3 4 5
update u set u.assid = s.assid from ud u innerjoin sale s on u.id = s.udid
MySQL方法
1 2 3 4
update ud u innerjoin sale s on u.id = s.udid set u.assid = s.assid
PostgreSQL方法
1 2 3 4
update ud set assid = s.assid from sale s where ud.id = s.udid;
Oracle方法
1 2 3 4 5 6 7 8
update (select u.assid as new_assid, s.assid as old_assid from ud u innerjoin sale s on u.id = s.udid) up set up.new_assid = up.old_assid
SQLite方法
1 2 3 4 5 6 7 8 9 10 11
update ud set assid = ( select sale.assid from sale where sale.udid = ud.id ) where RowID in ( select RowID from ud where sale.udid = ud.id );
简化的多表JOIN更新查询
1 2 3 4 5 6 7 8
UPDATE first_table ft JOIN second_table st ON st.some_id = ft.some_id JOIN third_table tt ON tt.some_id = st.some_id ..... SET ft.some_column = some_value WHERE ft.some_column =123456AND st.some_column =123456
使用公共表表达式(CTE)
1 2 3
with cte as (select u.assid col1 ,s.assid col2 from ud u innerjoin sale s on u.id = s.udid) update cte set col1=col2
MySQL性能优化示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
UPDATE users User INNERJOIN blacklist_users BlacklistUser ON ( User.username = BlacklistUser.account_ref OR User.email = BlacklistedUser.account_ref OR User.phone_number = BlacklistUser.account_ref AND User.is_active =1 AND BlacklistUser.has_run =0 ) SET User.is_active =0, BlacklistUser.has_run =1;