Oracle实现关联表更新数据

问题:

在日常的开发过程中,难免会少的了与数据处理打交道,下面有个需求:

有两张表T1、T2,对T1表的F_TITLE_PATCH字段进行更新,更新的条件是:T1的UUID和T2的UUID一致(说明:一个表中的uuid不重复)

T1和T2表SQL:

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语句(有坑)

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值。

正确写法:

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更新

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 @ 2024-01-09 18:09  Java小白的搬砖路  阅读(223)  评论(0)    收藏  举报