对于多表关联更新的总结

我得想法是用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);

这就是我的一些总结 也许有不对之处。欢迎大家拍砖、相互交流。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值