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;
相关推荐
山岚的运维笔记12 小时前
mysql 专业笔记 -- 第 36 章:MySQL 管理
运维·数据库·笔记·后端·mysql·oracle·dba
知识的搬运工旺仔13 小时前
唯一索引与 NULL 值:PostgreSQL 主键约束与 NULLS NOT DISTINCT
数据库·后端·sql·postgresql
geovindu14 小时前
sql: Transaction & Concurrency Patterns using Oracel 21c
oracle·数据库开发·数据库架构
jnrjian15 小时前
DRG-50857 ORA-30576 drixmd.PurgeKGL CTXSYS
数据库·oracle
jnrjian15 小时前
Domain index 解决中英文 联合查询
oracle
想念是会呼吸的鱼16 小时前
【ClickHouse 常用 SQL 语句整理】
sql·clickhouse
jnrjian17 小时前
Domain sync job SCHEDULER 空白job
oracle
想念是会呼吸的鱼17 小时前
MySQL 常用语法整理
sql·mysql
TLA技术18 小时前
LogMiner vs 裸日志解析(三):Oracle日志解析中的“前镜像”和“后镜像”,到底怎么用?
数据库·oracle·flink·dba·迁移学习
SelectDB技术团队19 小时前
StarRocks 迁移至 Apache Doris 完整指南:三步完成结构、数据与业务平滑切换
数据库·人工智能·sql·clickhouse·apache doris·selectdb·湖仓架构升级