我得想法是用TableB里面的列A来更新TableA的列A,关联条件为列B.
我称TableA为目标表,TableB为条件表。
Table A | Table B | ||||
列A | 列B | 列A | 列B | ||
多变关联更新 基本语句 Update TableA ta set ta.列A = (select tb.列A from TableB where tb.列B=ta.列B); | ||||||||
多变关联更新情况一 TableA的数据是全部被更新。并且要更新的记录在 TableB里面都能够找到。也是只能找到唯一的一条。这样使用基本语句就可以搞定。 | ||||||||
多变关联更新情况二 TableA的数据只有一部分数据需要更新。需要更新的数据在TableB里面都能找到。这时候如果写上面的基本语句回出现以下情况、如果TableA的列A不允许为空将会出现无法将Null插入TableA的列A。上面的基本语句会把TableA里面不需要更新的在TableB里面找不到对应的记录的列A更新为Null。 这时需要加上where exists 条件限制一下更新语句的范围。默认是把TableA全部更新。 | ||||||||
多变关联更新情况三 TableA的数据不是全部被更新。TableB里面列B的值一对多列A。这样通过基本更新语句无法确定一个列B对应一个列A的值那就会返回错误。这个需要用Rank函数来对列B分组列A排序找到自己想要的那条记录。具体实验语句 | ||||||||
update lik.temp_yangmm_1116_discnt dtd --在391条记录的表里找到379条记录去更新 set dtd.start_date = (select t.ydate from (select rank() over(partition by user_id order by td.start_date desc) rk, td.user_id yuser, td.start_date ydate from temp_user_discnt td where (td.user_id in (select tp.user_id from lik.temp_yangmm_1116_discnt tp where td.user_id = tp.user_id) and td.discnt_code = 70006569)) t where t.rk < 2 and dtd.user_id = t.yuser) where exists (select 1 from (select rank() over(partition by user_id order by td.start_date desc) rk, td.user_id yuser, td.start_date ydate from temp_user_discnt td where (td.user_id in (select tp.user_id from lik.temp_yangmm_1115_discnt tp where td.user_id = tp.user_id) and td.discnt_code = 70006569)) t where t.rk < 2 --限制取一条 and dtd.user_id = t.yuser); |
这就是我的一些总结 也许有不对之处。欢迎大家拍砖、相互交流。