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;

  

posted @   Java小白的搬砖路  阅读(199)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2021-01-09 10、整合mybatis时的数据库连接配置文件jdbc.properties

喜欢请打赏

扫描二维码打赏

支付宝打赏

点击右上角即可分享
微信分享提示