2023-11-24--oracle--实验--[Merge 语句]

oracle--实验---Merge语句

1.认知Merge 语句

merge 语句是 sql 语句的一种。在 SQL server Oracle 数据库中可用, MySQL 中不可用。
merge 用来合并 update insert 语句。目的:通过 merge 语句,根据一张表( 原数据表, source table 对另外一张( 目标表, target table 表进行查询,连接条件 匹配上 的进行 update 无法匹配 的执行 INSERT 。这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于 insert+update
何为匹配,何为不匹配?

/*示例程序块2 重要*/

sql 复制代码
/*示例程序块2   重要*/
  DECLARE
	    v_xm varchar2(8):='Jame';
		v_zym varchar2(10):='计算机';
		v_zxf number(2):=45;    /*定义变量类型*/
	BEGIN
               UPDATE XS  SET zxf=v_zxf
		           WHERE xm=v_xm;
    		IF SQL%NOTFOUND THEN
                DBMS_OUTPUT.PUT_LINE('没有该人,需要插入该人');
		      INSERT INTO XS(XH,XM,ZYM,ZXF)          VALUES('007',v_xm,v_zym,v_zxf);
	    END IF;
end;      

Merge应用场合

sql 复制代码
构建平台
create table PRODUCTS
    (
    PRODUCT_ID             INTEGER,
    PRODUCT_NAME      VARCHAR2(60),
    CATEGORY                VARCHAR2(60)
    );

create table NEWPRODUCTS
    (
    PRODUCT_ID                 INTEGER,
    PRODUCT_NAME          VARCHAR2(60),
    CATEGORY                    VARCHAR2(60)
    );

构建平台

sql 复制代码
        insert into PRODUCTS values (1501, 'VIVITAR 35MM', 'ELECTRNCS');    insert into PRODUCTS values (1502, 'OLYMPUS IS50', 'ELECTRNCS');    insert into PRODUCTS values (1600, 'PLAY GYM', 'TOYS');    insert into PRODUCTS values (1601, 'LAMAZE', 'TOYS');    insert into PRODUCTS values (1666, 'HARRY POTTER', 'DVD');    commit;


          Insert into NEWPRODUCTS values (1502, 'OLYMPUS CAMERA', 'ELECTRNCS');    insert into NEWPRODUCTS values (1601, 'LAMAZE', 'TOYS');    insert into NEWPRODUCTS values (1666, 'HARRY POTTER', 'TOYS');    insert into NEWPRODUCTS values (1700, 'WAIT INTERFACE', 'BOOKS');    commit;

Merge 用法--1

Merge 根据对 源表 联接的结果对 目标表 执行修改操作 ( 插入,更新,删除 )
应用场合:对于特定的数据,在 一次批量操作 过程中 ,如果数据已经 存在 ,则对存在的数据按照现有情况进行 更新 ,如果不存在,则需要将数据添加到数据库的表中。
具体操作: - 根据与 源表 联接的结果,对 目标表 执行插入、更新或删除操作。

Merge 语句:

sql 复制代码
Merge 插入记录、更新记录的语法格式:

•MERGE INTO tdest d
 USING  tsrc  s
    ON  (s.srckey = d.destkey)
          WHEN NOT MATCHED THEN
            INSERT  (destkey, destdata) VALUES  (srckey, srcdata)
•        WHEN MATCHED THEN
             UPDATE SET   d.destdata = d.destdata + s.srcdata;
•--  USING 子句用于指定要与目标联接的数据源。
•--  ON 子句用于指定决定目标与源的匹配位置的联接条件。
•--  WHEN 子句用于根据ON 子句的结果指定要执行的操作。

注意:当数据不匹配时,执行insert 语句的不同(省略了into 和

目标 表的名称);

当数据匹配时,执行update 语句的不同(省略了update之后的

目标表名称)。

使用表时必须使用表的别名。

Merge 用法--2

考虑有可能的情况是:

1. 原表 xs_s 中有该学生,但是 目的表 xs_d 中没有该学生 ,则需要将 原表中的学生 insert 到目的表

2. 原表 xs_s 有该学生,而且 xs_d 中也有该学生 ,则需要根据 原表中的学生信息 update 目的表,或者删除目的表中的部分记录
检查表 XS_JSJ 中的数据是否和表 XS 的数据相匹配,

如果匹配则使用 INSERT 子句执行插入数据行。

搭建平台 :create table xs1 as select * from xs ;

•INSERT INTO XS1(XH,XM,ZYM,XB,CSSJ,ZXF)
• VALUES(007' ,'test', '计算机','男', TO_DATE('19900130','YYYYMMDD'),36);
已知条件: 存在两个表 xs_s xs_d , 两个表的结构一致,内容

不统一。目前的想法是,合并两个表中所有的记录到 xs_d 中。

sql 复制代码
-- 使用MERGE语句XS_JSJ表中新增的数据插入表XS中:
		    MERGE INTO XS a
                  USING XS1  b
                  ON(a.XH=b.XH)
		    WHEN NOT MATCHED THEN             INSERT(a.xh,a.xm,a.zym,a.xb,a.cssj,a.zxf)
		    Values(b.xh,b.xm,b.zym,b.xb,b.cssj,b.zxf);

    

Merge 用法--3

构建平台

sql 复制代码
-- 构建平台
create table PRODUCTS
    (
    PRODUCT_ID             INTEGER,
    PRODUCT_NAME      VARCHAR2(60),
    CATEGORY                VARCHAR2(60)
    );

create table NEWPRODUCTS
    (
    PRODUCT_ID                 INTEGER,
    PRODUCT_NAME          VARCHAR2(60),
    CATEGORY                    VARCHAR2(60)
    );

构建平台

sql 复制代码
-- 构建平台

        insert into PRODUCTS values (1501, 'VIVITAR 35MM', 'ELECTRNCS');    insert into PRODUCTS values (1502, 'OLYMPUS IS50', 'ELECTRNCS');    insert into PRODUCTS values (1600, 'PLAY GYM', 'TOYS');    insert into PRODUCTS values (1601, 'LAMAZE', 'TOYS');    insert into PRODUCTS values (1666, 'HARRY POTTER', 'DVD');    commit;


          Insert into NEWPRODUCTS values (1502, 'OLYMPUS CAMERA', 'ELECTRNCS');    insert into NEWPRODUCTS values (1601, 'LAMAZE', 'TOYS');    insert into NEWPRODUCTS values (1666, 'HARRY POTTER', 'TOYS');    insert into NEWPRODUCTS values (1700, 'WAIT INTERFACE', 'BOOKS');    commit;

具体实现:

sql 复制代码
-- 具体实现: 
begin
      insert into PRODUCTS values (1501, 'VIVITAR 35MM', 'ELECTRNCS');
      insert into PRODUCTS values (1502, 'OLYMPUS IS50', 'ELECTRNCS');
      insert into PRODUCTS values (1600, 'PLAY GYM', 'TOYS');
      insert into PRODUCTS values (1601, 'LAMAZE', 'TOYS');
      insert into PRODUCTS values (1666, 'HARRY POTTER', 'DVD');
      commit;
      Insert into NEWPRODUCTS values (1502, 'OLYMPUS CAMERA', 'ELECTRNCS');
      insert into NEWPRODUCTS values (1601, 'LAMAZE', 'TOYS');
      insert into NEWPRODUCTS values (1666, 'HARRY POTTER', 'TOYS');
      insert into NEWPRODUCTS values (1700, 'WAIT INTERFACE', 'BOOKS');
      commit;
    end;

Merge 用法--4

说明:products为目标表,newproducts为源表,则若产品号相匹配,根据源表信息修改目标表的产品名(product_name)和产品类别(category)

sql 复制代码
merge into products p
     using newproducts np
          on (p.product_id=np.product_id)
when matched then
           update set
           p.product_name=np.product_name,
           p.category=np.category;


•加结果图和表原始数据图
•强调目标表
说明:products为目标表,newproducts为源表,则若产品号不匹配,则根据源表将新的纪录添加到目标表。

sql 复制代码
Merge into products p
 using newproducts np
  on (p.product_id = np.product_id)
   when  not matched then
     insert 
       values (np.product_id,np.product_name,
     np.category);

Merge 用法--5

sql 复制代码
-- 一个merge例子带update,delete 和insert 三种操作。
MERGE INTO products p
 USING newproducts np
 ON (p.product_id = np.product_id)
  WHEN MATCHED THEN
     UPDATE
    SET p.product_name = np.product_name,
    p.category = np.category
    DELETE WHERE (p.category = 'ELECTRNCS')
 WHEN NOT MATCHED THEN
    INSERT
    VALUES (np.product_id, np.product_name, np.category)

2.实验--实战

首先导入xskc.dmp文件

导入xskc.dmp文件:

输入命令:

sql 复制代码
SQL> $imp system/test tables=(xs,kc,xs_kc) file=C:\xskc.dmp

测试是否成功:

输入查询语句:

sql 复制代码
SQL> select * from xs;
相关推荐
小小不董4 小时前
Oracle OCP认证考试考点详解082系列16
linux·运维·服务器·数据库·oracle·dba
Mephisto.java5 小时前
【大数据学习 | HBASE高级】storeFile文件的合并
大数据·sql·oracle·json·hbase·database
不二人生5 小时前
SQL面试题——连续出现次数
hive·sql·面试
宋发元7 小时前
Go 数据库查询与结构体映射
数据库·oracle·golang
在下方方8 小时前
【快捷入门笔记】mysql基本操作大全-SQL表
笔记·sql·mysql
Ttang238 小时前
数据库&SQL——嵌套子查询(IN/NOT IN/SOME/ALL/EXIST/NOT EXIST)
数据库·sql
Denny辉10 小时前
Flink使用SQL Gateway提交SQL Job到远程集群
sql·flink·gateway
小鸡脚来咯12 小时前
spring boot 配置文件
spring boot·后端·oracle
看山还是山,看水还是。14 小时前
Oracle 外键
运维·数据结构·数据库·笔记·程序人生·oracle·全文检索
shix .14 小时前
数据库sql初识以及-增删改查
数据库·sql·oracle