更新日志:

  • [2020-03-11]
    文章发布

说明:


1. 准备数据
  • 创建test_atest_b两张结构相同的表,ID字段为主键。并插入一些数据
       CREATE TABLE TEST_A (
       ID NUMBER PRIMARY KEY,
       NAME NVARCHAR2(20) NOT NULL,
       UPDATEDON DATE);
    
       CREATE TABLE TEST_B (
       ID NUMBER PRIMARY KEY,
       NAME NVARCHAR2(20) NOT NULL,
       UPDATEDON DATE);
       
       INSERT INTO  test_a values(1, '张全蛋', sysdate);
       INSERT INTO  test_a values(2, '如花', sysdate);
       INSERT INTO  test_a values(3, '奥利给', sysdate);
       INSERT INTO  test_a values(4, '《你的答案》', sysdate);
       
       INSERT INTO  test_b values(3, '奥利给', sysdate);
       INSERT INTO  test_b values(4, '《你的答案》', sysdate);
       INSERT INTO  test_b values(5, '《起风了》', sysdate);
       INSERT INTO  test_b values(6, '《River Flows In You》', sysdate);
    
    src_test_a
    src_test_b
  • 注意
    • test_atest_b中都有id34的数据
    • 这两条数据idname字段的值表间对比相同
    • updatedon字段值不同
2. Merge into
  •   MERGE INTO test_b b
      USING(SELECT * FROM test_a) a
      ON (b.ID = a.ID)
      WHEN MATCHED THEN
      	-- 注意,这里 update的时候,不要 update唯一约束包含的字段,这里指 ID字段
      	UPDATE SET
      		b.NAME = a.NAME,
      		b.UPDATEDON = a.UPDATEDON
      WHEN NOT MATCHED THEN
      	INSERT(
      	    ID,
      	    NAME,
      	    UPDATEDON) VALUES(
      	    a.ID,
      	    a.NAME,
      	    a.UPDATEDON);
    
  • mergetest_b
    merge into
    • 绿色框中为新插入的数据行
    • 蓝色框中为被更新的数据行, id为3和4的数据的 UPDATEDON字段被更新了
    • 简单说明
      • 用结果集a的数据,通过和表test_b比较 ID字段的值来进行数据合并
      • id =a1atest_b中都有,则用a1a中的数据去更新a1test_b中的数据,
        也可以理解为把test_b中的ida1的数据删除,把a中的ida1的数据插入test_b,但实际执行的时候并不是这样,只是将对应的字段更新了。
      • id=a1只在一个表中有
        • 只在a中,直接将ida1的数据插入test_b
        • 只在test_b中,不执行任何操作
3. 用法说明
  • MERGE INTO 要合并到的表 t
    	USING( 用哪些数据去合并) s
    	ON(按照哪个唯一约束去合并,多个字段用 AND 连接, 如 s.id=t.id AND s.name=t.id)
    		-- 整个merge into 就是说id和name作为唯一约束(也就是通过这俩字段能定位到唯一一行数据),
    		-- s、t交集部分id和name所确定的数据,用s中的数据,去更新t中的数据,不更新唯一约束所包含的字段
    		-- s - t 所组成的差集,id和name所确定的数据,直接插入 t
    WHEN MATCHED THEN -- 两表中满足 ON条件的数据,执行以下内容
    UPDATE SET
    	t.columns=s.columns	--要更新哪些字段写哪些字段,但不要更新唯一约束中包含的字段(这里不要写id或者name字段)
    WHEN MATCHED THEN -- 两表中不满足ON条件的数据时执行以下内容
    	insert(
    	t中的字段名) VALUES(
    	s.字段名
    	);
    

The end.
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐