?
oracle--實驗---Merge語句
1.認知Merge? 語句
?
/*示例程序塊2?? 重要*/
/*示例程序塊2 重要*/DECLAREv_xm varchar2(8):='Jame';v_zym varchar2(10):='計算機';v_zxf number(2):=45; /*定義變量類型*/BEGINUPDATE XS SET zxf=v_zxfWHERE xm=v_xm;IF SQL%NOTFOUND THENDBMS_OUTPUT.PUT_LINE('沒有該人,需要插入該人');INSERT INTO XS(XH,XM,ZYM,ZXF) VALUES('007',v_xm,v_zym,v_zxf);END IF;
end;
Merge應用場合
構建平臺
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));
構建平臺
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 插入記錄、更新記錄的語法格式:?MERGE INTO tdest dUSING ?tsrc? sON? (s.srckey = d.destkey)WHEN NOT MATCHED THENINSERT? (destkey, destdata) VALUES? (srckey, srcdata)
???????? WHEN MATCHED THENUPDATE 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;
?
不統一。目前的想法是,合并兩個表中所有的記錄到xs_d中。
-- 使用MERGE語句XS_JSJ表中新增的數據插入表XS中:MERGE INTO XS aUSING XS1 bON(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
構建平臺
-- 構建平臺
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));
構建平臺
-- 構建平臺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;
具體實現:
-- 具體實現:
begininsert 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)
merge into products pusing newproducts npon (p.product_id=np.product_id)
when matched thenupdate setp.product_name=np.product_name,p.category=np.category;
說明:products為目標表,newproducts為源表,則若產品號不匹配,則根據源表將新的紀錄添加到目標表。
Merge into products pusing newproducts npon (p.product_id = np.product_id)when not matched theninsert values (np.product_id,np.product_name,np.category);
Merge 用法--5
-- 一個merge例子帶update,delete 和insert 三種操作。
MERGE INTO products pUSING newproducts npON (p.product_id = np.product_id)WHEN MATCHED THENUPDATESET p.product_name = np.product_name,p.category = np.categoryDELETE WHERE (p.category = 'ELECTRNCS')WHEN NOT MATCHED THENINSERTVALUES (np.product_id, np.product_name, np.category)
?
2.實驗--實戰?
首先導入xskc.dmp文件
導入xskc.dmp文件:
輸入命令:
SQL> $imp system/test tables=(xs,kc,xs_kc) file=C:\xskc.dmp
測試是否成功:
輸入查詢語句:
SQL> select * from xs;
?
?
?
?
?
?