Merge into 多表关联查询插入 对比 Replace into

本文详细介绍了如何使用SQL的Merge语句将两张源表A和B的数据同步到目标表C中,包括使用内连接和左连接的不同场景,并提供了Oracle和Mysql的具体实现语句。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设有以下2张源表A和表B
     A(pkey,a1,a2,a3)
     B(pkey.b1,b2,b3)
     与此同时数据库里也有了一张目标表C,C的表结构为
     C(pkey,a1,b1,c1,a2,b2)

把A和B中对应字段的数据同步到C中,同时c1的数据给个默认值:建表语句如下:

drop table A;
drop table B;
drop table C;

create table A(
       pkey varchar2(10),
	   a1 varchar2(10),
	   a2 varchar2(10),
	   a3 varchar2(10),
       PRIMARY KEY (pkey) 
);

create table B(
       pkey varchar2(10),
	   b1 varchar2(10),
	   b2 varchar2(10),
	   b3 varchar2(10),
       PRIMARY KEY (pkey) 
);

create table C(
       pkey varchar2(10),
	   a1 varchar2(10),
	   b1 varchar2(10),
	   c1 varchar2(10),
	   a2 varchar2(10),
	   b2 varchar2(10),
       PRIMARY KEY (pkey) 
);

INSERT INTO A (pkey,a1,a2,a3) VALUES(1,'a','a','a');
INSERT INTO A (pkey,a1,a2,a3) VALUES(2,'a1','a1','a1');
INSERT INTO A (pkey,a1,a2,a3) VALUES(3,'a3','a3','a3');
INSERT INTO A (pkey,a1,a2,a3) VALUES(4,'a4','a4','a4');
INSERT INTO B (pkey,b1,b2,b3) VALUES(1,'b','b','b');
INSERT INTO B (pkey,b1,b2,b3) VALUES(2,'b1','b1','b1');
INSERT INTO B (pkey,b1,b2,b3) VALUES(3,'b2','b2','b2');

Merge into 为:

MERGE INTO C tmpC
USING (
  SELECT
        tmpA.pkey,
        tmpA.a1,
        tmpB.b1,
        'c1的默认值',
        tmpA.a2,
        tmpB.b2 
      FROM
        ( SELECT pkey, a1, a2 FROM A )tmpA , 
        ( SELECT pkey, b1, b2 FROM B )tmpB  	
    WHERE tmpB.pkey = tmpA.pkey 
)tmp ON(tmpC.pkey=tmp.pkey)
WHEN MATCHED THEN
     UPDATE SET 
            tmpC.a1=tmp.a1,
            tmpC.b1=tmp.b1,
            tmpC.c1='c1的默认值',
            tmpC.a2=tmp.a2,
            tmpC.b2=tmp.b2
WHEN NOT MATCHED THEN 
     INSERT (pkey,a1, b1,c1,a2,b2)VALUES(tmp.pkey,tmp.a1,tmp.b1,'c1的默认值',tmp.a2,tmp.b2);

若以A的主键Pkey为主,使用左连接

MERGE INTO C tmpC
USING (
  SELECT
    tmpA.pkey,
    tmpA.a1,
    tmpB.b1,
    'c1的默认值',
    tmpA.a2,
    tmpB.b2 
  FROM
    ( SELECT pkey, a1, a2 FROM A )tmpA left join ( SELECT pkey, b1, b2 FROM B )tmpB  	on tmpB.pkey = tmpA.pkey 
)tmp ON(tmpC.pkey=tmp.pkey)
WHEN MATCHED THEN
     UPDATE SET 
            tmpC.a1=tmp.a1,
            tmpC.b1=tmp.b1,
            tmpC.c1='c1的默认值',
            tmpC.a2=tmp.a2,
            tmpC.b2=tmp.b2
WHEN NOT MATCHED THEN 
     INSERT (pkey,a1, b1,c1,a2,b2)VALUES(tmp.pkey,tmp.a1,tmp.b1,'c1的默认值',tmp.a2,tmp.b2);

在Mysql中的相同语句为:

INSERT REPLACE INTO C ( pkey, a1, b1, c1, a2, b2 )
VALUES
	(
	SELECT
		tmp_A.pkey,
		tmp_A.a1,
		tmp_B.b1,
		'c1的默认值',
		tmp_A.a2,
		tmp_B.b2,
	FROM
		( SELECT pkey, a1, a2 FROM A ) tmp_A,
		( SELECT pkey, b1, b2 FROM B ) tmp_B 
	WHERE
		tmp_B.pkey = tmp_A.pkey 
	);

 

### 关于 SQL 中 `MERGE INTO` 语句的用法 在处理数据库操作时,有时需要根据某些条件更新现有记录或者插入新记录。对于这种情况,SQL 提供了 `MERGE INTO` 语法来简化这一过程[^1]。 #### 基本结构 `MERGE INTO` 的基本形式如下: ```sql MERGE INTO target_table AS T USING source_table AS S ON match_condition WHEN MATCHED THEN UPDATE SET column1 = value1 [, column2 = value2 ...] WHEN NOT MATCHED THEN INSERT (column_list) VALUES (value_list); ``` 这里的关键部分包括目标(`target_table`)、源(`source_table`)以及匹配条件(`match_condition`)。当找到符合条件的数据行时执行更新;如果没有找到,则会触发插入动作。 #### 实际案例演示 假设有一个名为 `employees` 的员工信息格和另一个临时加载的新数据集 `new_employees` ,可以利用 `MERGE INTO` 来同步两个集合之间的差异: ```sql -- 合并 employees 和 new_employees 格中的数据 MERGE INTO employees e USING new_employees ne ON e.employee_id = ne.employee_id WHEN MATCHED AND ne.status='inactive' THEN DELETE -- 如果状态为 inactive 则删除旧记录 WHEN MATCHED THEN UPDATE SET salary=ne.salary, department=ne.department -- 更新已存在的记录 WHEN NOT MATCHED THEN INSERT (employee_id,name,salary,department,status) VALUES(ne.employee_id,ne.name,ne.salary,ne.department,'active'); -- 插入不存在的新纪录 ``` 此命令能够有效地管理重复项,并保持最新的雇员资料库。 #### 注意事项 需要注意的是并非所有的关系型数据库管理系统都支持 `MERGE INTO` 运算符。例如,在 MySQL 数据库中虽然不直接提供 `MERGE INTO` 支持,但是可以通过其他方式实现相同的功能,比如使用 `INSERT ... ON DUPLICATE KEY UPDATE` 或者 `REPLACE INTO` 句法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值