需求:
有兩張表A,B。表A和表B有共同的字段,id,dev_ip,collector_id. 其中id是作為兩個表關聯的唯一標識。即表A中的id與表B中的id是一一對應的。本來B表中的字段collector_id應該是完全一致的,但是由於某些原因B表中的collect_id值被修改了,現在需要將A,B表的collector_id同步成一致。即將A表中與B表id和dev_ip一樣的數據行更新B表中的collector_id為A表中的collector_id值。
實現方法有以下幾種:
tb_device_info表為B表,tb_device表為A表
方法一:
update tb_device_info di set collectorid = (select d.collector_id from tb_device d where d.id = di.deviceid )
where deviceid = (select d.id from tb_device d where d.id = di.deviceid and di.collectorid <> d.collector_id)
方法二:道理同方法一。
update tb_device_info di set collectorid = (select d.collector_id from tb_device d where d.id = di.deviceid )
where (select 1 from tb_device d where d.id = di.deviceid and di.collectorid <> d.collector_id)
方法三:原理是更新已查條件結果集,相當於更新同一個表中的兩個不同字段。
update (select di.deviceid ,di.dev_ip ,di.collectorid ,d.id ,d.dev_ip ,d.collector_id
from tb_device_info di ,tb_device d where di.deviceid = d.id and di.collectorid <> d.collector_id)
set collectorid= collector_id
方法四:存儲過程的方式
declare cursor cur_collecot
is
select collector_id,id from tb_device;
begin
for my_cur in cur_collecot loop
update tb_devic_info set collectorid = my_cur.collector_id
where deviceid = my_cur.id;
end loop;
以上方法參考網絡文章終結,記錄以備使用
另轉載網絡牛人原文
為了做分析,需要整合一些數據到一個表中,涉及到通過主鍵關聯多個表,獲取其中的某些字段的值,通過update可以簡單實現,找了一篇文章,挺不錯:
批量更新表時,update一個表的列時,需要依賴另外的表,這種依賴可以是where條件子句,也可以要update的field的值依賴另外的表
通常有兩種做法
1.使用存儲過程
2.在程序代碼里逐條循環執行
這里給出一種更高效、簡潔的做法,批量更新SQL ,一句SQL就可以替代麻煩的循環過程,有MS SQLServer、Oracle、DB2下的寫法
--關鍵點:t4和t1是同一個table,primary key肯定也是同一個,
--並以它進行關聯,這樣在 select語句里即可引用到要update的表的fields
UPDATE Table1 AS t1
SET (Field1,Field2) = (SELECT Field21, Field22
FROM Table2 t2
INNER JOIN Table3 t3
ON t3.Field31 = t2.Field23
INNER JOIN Table4 t4
ON t3.Field32 = t4.Filed41
WHERE t2.Field24 >= ''
AND t1.fId = t4.fId);
----------------------------MS SQLServer --------------------------------------
UPDATE t1
SET Field1 = Field21, Field2 = Field22
FROM Table2 t2
INNER JOIN Table3 t3
ON t3.Field31 = t2.Field23
INNER JOIN Table4 t4
ON t3.Field32 = t4.Filed41
WHERE ((t2.Field24 >= '')
AND t1.fId = t4.fId);
----------------------------Oracle --------------------------------------------
UPDATE Table1 t1
SET (Field1,Field2) = (SELECT Field21, Field22
FROM Table2 t2
INNER JOIN Table3 t3
ON t3.Field31 = t2.Field23
INNER JOIN Table4 t4
ON t3.Field32 = t4.Filed41
WHERE ((t2.Field24 >= '')
AND t1.fId = t4.fId))
WHERE EXISTS (SELECT Field21, Field22
FROM Table2 t2
INNER JOIN Table3 t3
ON t3.Field31 = t2.Field23
INNER JOIN Table4 t4
ON t3.Field32 = t4.Filed41
WHERE ((t2.Field24 >= '')
AND t1.fId = t4.fId));
---------------------------------DB2 ------------------------------------------
UPDATE Table1 AS t1
SET (Field1,Field2) = (SELECT Field21, Field22
FROM Table2 t2
INNER JOIN Table3 t3
ON t3.Field31 = t2.Field23
INNER JOIN Table4 t4
ON t3.Field32 = t4.Filed41
WHERE ((t2.Field24 >= '')
AND t1.fId = t4.fId))
WHERE EXISTS (SELECT Field21, Field22
FROM Table2 t2
INNER JOIN Table3 t3
ON t3.Field31 = t2.Field23
INNER JOIN Table4 t4
ON t3.Field32 = t4.Filed41
WHERE ((t2.Field24 >= '')
AND t1.fId = t4.fId));
