如何根据Table1的Type字段变更同步更新Table2的SD列
如何根据Table1的Type字段变更同步更新Table2的SD列
嘿,我懂你的困惑啦——其实你现在写的UPDATE语句本身就可以处理后续Type字段变更的情况!不过咱们可以把逻辑理得更清楚,还能聊聊怎么实现自动同步,不用每次手动跑脚本。
一、手动同步:直接复用(或优化)你的语句
你原来的语句是基于当前Table1的最新状态来判断的,所以不管是第一次初始化SD列,还是后续Table1里的Type从mb-sd改成mb,只要重新运行这条UPDATE,Table2的SD就会自动同步成正确的值。比如你举的例子,当OLEM的Type变成mb后,运行这条语句,它的SD就会从YES改成NO。
不过如果数据量比较大,用JOIN的方式会比子查询更高效,也更直观,推荐试试这个版本:
UPDATE t2 SET SD = CASE WHEN t1.[Type] LIKE '%sd' THEN 'YES' ELSE 'NO' END FROM Table2 t2 LEFT JOIN Table1 t1 ON t1.MEID = t2.MEID
这个语句用LEFT JOIN关联两个表,直接根据Table1的Type字段判断SD值,就算Table1里某个MEID的记录被删除(如果有这种情况),Table2对应的SD也会被设为NO,逻辑更完整。
二、自动同步:用触发器实现实时更新
如果不想每次手动跑UPDATE,想让Table2的SD列在Table1的Type变更时自动同步,可以给Table1创建一个触发器。这样只要Table1有插入、更新、删除操作,触发器就会自动更新Table2中对应MEID的SD值:
CREATE TRIGGER trg_UpdateTable2SD ON Table1 AFTER INSERT, UPDATE, DELETE AS BEGIN SET NOCOUNT ON; -- 只更新受Table1操作影响的MEID,避免全表更新浪费性能 UPDATE t2 SET SD = CASE WHEN EXISTS (SELECT 1 FROM Table1 t1 WHERE t1.MEID = t2.MEID AND t1.[Type] LIKE '%sd') THEN 'YES' ELSE 'NO' END FROM Table2 t2 WHERE t2.MEID IN (SELECT MEID FROM inserted UNION SELECT MEID FROM deleted) END
触发器里用inserted和deleted系统表获取受影响的MEID,只更新这些对应的记录,性能更好。以后不管Table1的Type怎么变,Table2的SD都会自动跟上啦!
备注:内容来源于stack exchange,提问作者aasenomad
相关产品推荐
相关产品推荐

