Bo's Oracle Station

查看: 1043|回复: 0

MERGE和关联删除和关联更新

[复制链接]

1005

主题

1469

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
12012
发表于 2020-10-13 16:17:28 | 显示全部楼层 |阅读模式
Merge是根据某个row source而有条件地选择性insert/delete/update目的表。但是它通过1次全表扫描(假设执行计划是全表扫描访问)就能够实现3次全表扫描才能完成的任务,因此提高了SQL执行的性能。由于它既然是insert/delete/update的合体,为了更清楚地了解原理,我们应该也能够将它拆解成关联更新、关联删除和普通插入:

创建实验表:
  1. create table t071se09_a( id number , a varchar2(20))  ;

  2. create table t071se09_b( id number , a varchar2(20))  ;

  3. insert into  t071se09_a values ( 1, 'A');

  4. insert into  t071se09_a values ( 2, 'B');

  5. insert into  t071se09_b values ( 1, 'AA');

  6. insert into  t071se09_b values ( 2, 'BB');

  7. insert into  t071se09_b values ( 100, 'XX');

  8. commit;
复制代码
查看表的内容:
  1. select  * from t071se09_a;
复制代码
1    A
2    B
  1. select  * from t071se09_b;
复制代码
1    AA
2    BB
100    XX
执行以下的merge(以t071se09_b为标准更新t071se09_a):
  1. MERGE INTO t071se09_a t
  2. USING   t071se09_b c
  3. ON (t.id = c.id)
  4. WHEN MATCHED THEN
  5. UPDATE SET
  6. t.a = c.a
  7. DELETE WHERE ( c.id=2)
  8. WHEN NOT MATCHED THEN
  9. INSERT VALUES ( c.id, c.a);

  10. commit;
复制代码
3 rows merged.
  1. select  * from t071se09_a;
复制代码
1    AA
100    XX
b表作为标准,不会变化:
  1. select  * from t071se09_b;
复制代码
1    AA
2    BB
100    XX
让我们用“关联更新、关联删除和普通插入”重新实现一遍上面的效果:
  1. truncate table t071se09_a;

  2. insert into  t071se09_a values ( 1, 'A');

  3. insert into  t071se09_a values ( 2, 'B');

  4. commit;
复制代码
查看表的内容:
  1. select  * from t071se09_a;
复制代码
1    A
2    B
普通插入:
  1. insert into t071se09_a select * from t071se09_b
  2.   where id not in ( select  id from t071se09_a );
复制代码
1 rows inserted.
关联更新:
  1. update t071se09_a t set t.a=( select  a from t071se09_b c where t.id=c.id );
复制代码
3 rows updated.

关联删除:
  1. delete from t071se09_a t where exists ( select 'X' from t071se09_b c
  2.   where t.id=c.id  and c.id=2) ;
复制代码
1 rows deleted.
a表的结果与之前merge的结果一样:

  1. select  * from t071se09_a;  
复制代码
1    AA
100    XX


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Bo's Oracle Station   

GMT+8, 2024-5-3 05:22 , Processed in 0.033726 second(s), 24 queries .

快速回复 返回顶部 返回列表