Oracle实现关联表更新数据
问题:
在日常的开发过程中,难免会少的了与数据处理打交道,下面有个需求:
1 | 有两张表T1、T2,对T1表的F_TITLE_PATCH字段进行更新,更新的条件是:T1的UUID和T2的UUID一致(说明:一个表中的uuid不重复) |
T1和T2表SQL:
1 2 3 4 5 6 | INSERT INTO "T_FILE_SYNC" ( "ID" , "F_UUID" , "F_TITLE_PATCH" ) VALUES ( '1' , '666666' , '/lib' ); INSERT INTO "T_FILE_SYNC" ( "ID" , "F_UUID" , "F_TITLE_PATCH" ) VALUES ( '2' , '888888' , '/opt' ); INSERT INTO "T_FILE_SYNC" ( "ID" , "F_UUID" , "F_TITLE_PATCH" ) VALUES ( '3' , '777777' , '/dev' ); INSERT INTO "T_FILE_ACCESS" ( "ID" , "F_UUID" , "F_TITLE_PATCH" ) VALUES ( '1' , '666666' , '/usr' ); INSERT INTO "T_FILE_ACCESS" ( "ID" , "F_UUID" , "F_TITLE_PATCH" ) VALUES ( '2' , '888888' , '/var' ); INSERT INTO "T_FILE_ACCESS" ( "ID" , "F_UUID" , "F_TITLE_PATCH" ) VALUES ( '3' , '999999' , '/root' ); |
思路:
刚开始想的是使用Java去做,遍历查询T1表中的所有记录,拿到UUID去T2表中查询,查到了就去更新这条数据。
显然这种方式效率比较低,通过网络IO去一个个查询,太慢了,所以这中方法被pass~
下面通过SQL进行实现该功能。
解决方案:
第一种:常用的update语句(有坑)
1 | UPDATE T_FILE_SYNC t1 SET t1.F_TITLE_PATCH = ( SELECT t2.F_TITLE_PATCH FROM T_FILE_ACCESS t2 WHERE t1.F_UUID = t2.f_uuId ) |
这种方式会导致T1表中存在的path路径,但是md5没有与T2表匹配到,会导致出现T1表中path有值的情况下,会被更新为NULL值。
正确写法:
1 2 3 4 | UPDATE T_FILE_SYNC t1 SET t1.F_TITLE_PATCH = ( SELECT t2.F_TITLE_PATCH FROM T_FILE_ACCESS t2 WHERE t1.F_UUID = t2.f_uuId ) WHERE EXISTS ( SELECT 1 FROM T_FILE_ACCESS t2 WHERE t1.F_UUID = t2.f_uuId ); |
第二种:使用merge更新
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | MERGE INTO t_file_sync target -- 1、目标表(进行更新的) USING ( -- 2、查询出要进行更新的数据 SELECT t1.id, t1.f_title_patch as old_patch, t2.f_title_patch as new_patch FROM t_file_sync t1 JOIN t_file_access t2 ON t1.f_uuid = t2.f_uuid ) source -- 3、连接条件 ON (target.ID = source.ID) -- 4、更新数据 WHEN MATCHED THEN UPDATE SET target.f_title_patch = source.new_patch; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2021-01-09 10、整合mybatis时的数据库连接配置文件jdbc.properties