ORACLE 給一個MERGE語句 例子和解釋
Oracle MERGE 例子
Oracle 9i 開始支持 MERGE語句
Oracle的MERGE 相對于SQL Server 2008 的 MERGE。
功能上,缺少一個 WHEN NOT MATCHED BY SOURCE 的情況。
-- 源表
CREATE TABLE test_from (id INT, val VARCHAR(20));
-- 目標表
CREATE TABLE test_to (id INT, val VARCHAR(20));
-- 插入源表
INSERT INTO test_from VALUES (1, 'A');
INSERT INTO test_from VALUES (2, 'B');
-- 合并 源表到目標表
MERGE INTO test_to
USING test_from
ON ( test_* = test_* ) -- 條件是 id 相同
WHEN MATCHED THEN UPDATE SET test_* = test_* -- 匹配的時候,更新
WHEN NOT MATCHED THEN INSERT VALUES(test_*, test_*) -- 源表有,目標表沒有,插入
-- 第一次檢查 目標表數據.
SQL> SELECT * FROM test_to;
ID VAL
---------- --------------------
1 A
2 B
-- 更新源表
UPDATE test_from SET val = 'A2' WHERE id = 1;
-- 刪除源表
DELETE FROM test_from WHERE id = 2;
-- 插入源表
INSERT INTO test_from VALUES (3, 'C');
-- 合并 源表到目標表
MERGE INTO test_to
USING test_from
ON ( test_* = test_* ) -- 條件是 id 相同
WHEN MATCHED THEN UPDATE SET test_* = test_* -- 匹配的時候,更新
WHEN NOT MATCHED THEN INSERT VALUES(test_*, test_*) -- 源表有,目標表沒有,插入
-- 再次檢查 目標表數據.
SQL> SELECT * FROM test_to;
ID VAL
---------- --------------------
1 A2
2 B
3 C
如何使用Oracle10gMERGE語句更新數據行
在Oracle 9i R2版中引入的MERGE語句通常被稱作“更新插入”(upsert),因為使用MERGE可以在同一個步驟中更新(update)并插入(insert)數據行,對于抽取、轉換和載入類型的應用軟件可以節省大量寶貴的時間,比如向數據倉庫中加載數據,數據倉庫中沒有的數據行可以插入到數據倉庫中,而已經存在的數據行也同時被更新。
在MERGE語句引入的時候,需要同時使用一條UPDATE和一條INSERT語句,順序也是固定的(先使用UPDATE語句,然后是INSERT語句)。如果您只需要使用其中的某一條一句,您只需要使用現有的INSERT或者UPDATE語句,而不必使用MERGE語句,而刪除數據可以使用DELETE語句。
在Oracle 10g R1版中,MERGE語句發生了變化,UPDATE或INSERT語句不再是必須的,而是可選項,您可以兩者都用也可以都不用,而且,UPDATE語句也具備了DELETE的功能,您可以在同一個步驟中對現有的有效記錄進行升級并清理廢棄的記錄。 列表A創建了一個表格列出現有項目:項目號碼、標題、開始日期、進度完成比例以及員工對項目的響應,還創建了一個事務表格使用MERGE語句進行升級批處理。
DROP TABLE open_projects; DROP TABLE project_updates; CREATE TABLE open_projects (pno NUMBER (6) PRIMARY KEY, title VARCHAR2(40), startdate DATE, pctdone NUMBER (3), empno NUMBER (6) ); INSERT INTO open_projects VALUES (10, 'Inventory servers', '08-JAN-07',0, 206); INSERT INTO open_projects VALUES (20, 'Upgrade Oracle on SRV01','15-JAN-07', 0, 206); INSERT INTO open_projects VALUES (30, 'Conduct skills assessment','22-JAN-07', 0, 210); CREATE TABLE project_updates (action CHAR (1), pno NUMBER (6), pctdone NUMBER (3), empno NUMBER (6) ); INSERT INTO project_updates VALUES ('C', 10, 50, 214); INSERT INTO project_updates VALUES ('D', 20, NULL, NULL); COMMIT; 列表A 一個典型的MERGE語句從識別表格開始執行升級,而且對現有的記錄進行篩選測試: MERGE INTO open_projects op USING project_updatespu ON (op。 pno = pu。
pno) 。
。 表格open_projects會接受更新的數據,而project_updates表格則不會改變,如果項目號碼(pno)在兩個表格中都一樣,那么數據行則被認為是相同的。
MERGE語句剩下的部分是更新語句,以及DELETE WHERE語法。 。
WHEN MATCHED THEN UPDATE SET pctdone = pu。pctdone, empno = pu。
empno DELETE WHERE pu。action = 'D'; 列表B展示了MERGE語句運行前后的表格情況。
SQL> @mergedel_b PNO TITLE STARTDATE PCTDONE EMPNO ---------- ---------------------------------------- --------- ---------- ---------- 10 Inventory servers 08-JAN-07 0 206 20 Upgrade Oracle on SRV01 15-JAN-07 0 206 30 Conduct skills assessment 22-JAN-07 0 210。
oracle里通過merge語句判斷重復插入方法是什么呢
由于項目中需要用到批量插入,為了防止用戶插入重復的數據,需要先判斷插入的數據是不是已經存在,如果存在則忽略這次插入,否則插入這條數據,剛開始的時候是先用一條SQL語句判斷,如果返回結果是真(記錄已經存在),則忽略,否則插入這條數據,這樣的話插入一條數據就要發起兩個到數據庫的連接,后來發現這樣做效率實在太低了,Google了一下,發現oracle數據庫支持merge語句,做了個測試,成功了,記錄下來供本人及同行以后查閱之用。
數據庫:TEST 1 CREATE TABLE TEST( 2 ID NUMBER NOT NULL, 3 NAME VARCHAR2(30) NOT NULL, 4 SEX VARCHAR2 (2) DEFAULT '男' 5 ) 插入兩條數據: 1 INSERT INTO TEST VALUES(1,'SUNZHENXING','男') 2 INSERT INTO TEST VALUES(2,'SUNHAILONG','女') MERGE語句: 1 MERGE INTO TEST A USING TEST B 2 ON (A。 NAME=B。
NAME) 3 WHEN MATCHED THEN 4 UPDATE SET A。SEX='女'WHERE A。
NAME='SUNZHENXING' 5 WHEN NOT MATCHED THEN 6 INSERT VALUES (3,'SUNZHENXING','女') 需要注意的是:MERGE語句中的UPDATE語句和INSERT語句和一般的SQL語句格式有點不同 考試大溫馨提示:本內容來源于網絡,僅代表作者個人觀點,與本站立場無關,僅供您學習交流使用。 其中可能有部分文章經過多次轉載而造成文章內容缺失、錯誤或文章作者不詳等問題,請您諒解。
如有侵犯您的權利,請聯系我們,本站會立即予以處理。
Oracle9i后的Merge語句應該怎么用
動機: 想在Oracle中用一條SQL語句直接進行Insert/Update的操作。
說明: 在進行SQL語句編寫時,我們經常會遇到大量的同時進行Insert/Update的語句 ,也就是說當存在記錄時,就更新(Update),不存在數據時,就插入(Insert)。 實戰: 接下來我們有一個任務,有一個表T,有兩個字段a,b,我們想在表T中做Insert/Update,如果存在,則更新T中b的值,如果不存在,則插入一條記錄。
在Microsoft的SQL語法中,很簡單的一句判斷就可以了,SQL Server中的語法如下: if exists(select 1 from T where T。 a=''1001'' ) update T set T。
b=2 Where T。a=''1001'' else insert into T(a,b) values(''1001'',2); 以上語句表明當T表中如果存在a=''1001'' 的記錄的話,就把b的值設為2,否則就Insert一條a=''100'',b=2的記錄到T中。
但是接下來在Oracle中就遇到麻煩了,記得在Oracle 9i之后就有一條Merge into 的語句可以同時進行Insert 和Update的嗎,Merge的語法如下: MERGE INTO table_name alias1 USING (table|view|sub_query) alias2 ON (join condition) WHEN MATCHED THEN UPDATE table_name SET col1 = col_val1, col2 = col2_val WHEN NOT MATCHED THEN INSERT (column_list) VALUES (column_values); 上面的語法大家應該都容易懂吧,那我們按照以上的邏輯再寫一次。 MERGE INTO T T1 USING (SELECT a,b FROM T WHERE t。
a=''1001'') T2 ON ( T1。a=T2。
a) WHEN MATCHED THEN UPDATE SET T1。b = 2 WHEN NOT MATCHED THEN INSERT (a,b) VALUES(''1001'',2); 以上的語句貌似很對是吧,實際上,該語句只能進行更新,而無法進行Insert,錯誤在哪里呢? 其實在Oracle中Merge語句原先是用來進行整表的更新用的,也就是ETL工具比較常用的語法,重點是在Using上。
用中文來解釋Merge語法,就是: 在alias2中Select出來的數據,每一條都跟alias1進行 ON (join condition)的比較,如果匹配,就進行更新的操作(Update),如果不匹配,就進行插入操作(Insert)。 因此,嚴格意義上講,”在一個同時存在Insert和Update語法的Merge語句中,總共Insert/Update的記錄數,就是Using語句中alias2的記錄數。”
以上這句話也就很好的解釋了在上面寫的語句為何只能進行Update,而不能進行Insert了,因為都Select不到數據,如何能進行Insert呢:) 接下來要改成正確的語句就容易多了,如下: MERGE INTO T T1 USING (SELECT ''1001'' AS a,2 AS b FROM dual) T2 ON ( T1。 a=T2。
a) WHEN MATCHED THEN UPDATE SET T1。b = T2。
b WHEN NOT MATCHED THEN INSERT (a,b) VALUES(T2。a,T2。
b); 查詢結果,OK! 注意: 如果不懂Merge語句的原理,Merge語句是一條比較危險的語句,特別是在您只想更新一條記錄的時候,因為不經意間,你可能就把整表的數據都Update了一遍。 我曾經犯過的一個錯誤如下所示,大家看出來是什么問題了嗎? MERGE INTO T T1 USING (SELECT Count(*) cnt FROM T WHERE T。
a=''1001'') T2 ON (T2。cnt>0) WHEN MATCHED THEN UPDATE SET T1。
b = T2。b WHEN NOT MATCHED THEN INSERT (a,b) VALUES(T2。
a,T2。b);。
sas 中merge語句里的覆蓋數據集是什么意思?"用遠離merge語句的
(1)如果僅僅使用merge語句,而不同時使用by語句的話,就是進行一對一的橫向合并。在不同數據集變量名相同的情況下,后面的數據集(也就是覆蓋數據集)的變量值會覆蓋前面的數據集,即使后面數據集的變量值為空。
(2)如果同時使用了by語句,就是進行匹配合并。合并結果數據集的變量值如下確定:
(i)對不同的變量,應該是merge語句后面該變量所屬的那個數據集。
(ii)對相同的變量,應該是該變量對應的merge語句后最后的那個數據集。也就是說,在變量名相同的情況下,遠離merge語句的數據集(也就是覆蓋數據集)的變量值會覆蓋近merge語句的數據集。不嫌麻煩的話,分析一下包含merge語句的data步的PDV流程,就很好理解了。
SQL Server2008中的MERGE SQL語句中的MERGE的全稱是什麼?代
merge 是sqlserver2008的新語句
SQL Server 2008將包含用于合并兩個行集(rowset)數據的新句法。根據一個源數據表對另一個數據表進行確定性的插入、更新和刪除這樣復雜的操作,運用新的MERGE語句,開發者用一條命令就可以完成。
對兩個表進行信息同步時,有三步操作要進行。首先要處理任何需要插入目標數據表的新行。其次是處理需要更新的已存在的行。最后要刪除不再使用的舊行。這個過程中需要維護大量重復的邏輯,并可能導致微妙的錯誤。
Bob Beauchemin討論了MERGE語句,這個語句將上述的多個操作步驟合并成單一語句。他給出了如下的例子:
merge [target] t
using [source] s on * = *
when matched then update set * = *, * = * -- use "rowset1"
when not matched then insert values(id,name,age) -- use "rowset2"
when not matched by source then delete; -- use "rowset3"
如你所見,具體操作是根據后面的聯合(join)的解析結果來確定的。在這個例子中,如果目標和源數據表有匹配的行,就實行更新操作。如果沒有,就實行插入或者刪除操作來使目標數據表和源數據表保持一致。
這個新句法的一個美妙之處是它在處理更新時的確定性。在使用標準的UPDATE句法和聯合時,可能有超過一個源行跟目標行匹配。在這種情況下,無法預料更新操作會采用哪個源行的數據。
而當使用MERGE句法時,如果存在多處匹配,它會拋出一個錯誤。這就提醒了開發者,要達到預想的目標,當前的聯合條件還不夠明確。
至于 ppt 沒有
有本pdf http://**f/*
如何理解T-SQL中Merge語句
SQL Server 2008 引入了Merge關鍵字,主要是在一條語句里面可以執行insert、update、delete操作,以實現用一個源對象的數據對目標對象數據進行操作。
注意這里的”源對象“和”目標對象“我用黑色標注了,源對象和目標對象實際上不僅僅可以是表Table,還可以是臨時表、視圖、表變量、CTE,同時”目標對象“還可以是Select語句,說這么多其實想表達Merge語句可以很靈活的使用,但是我們理解的話,可以把”源對象“和”目標對象“想象成Table就行了,畢竟臨時表、視圖、表變量、CTE也都可以想象成Table。
teradata 數據庫的merge 語句
需求:
將t2表的數據插入t1,當t2的a2值存在a1中時,使用t2的數據更新t1的數據,當a2的值不存在時,直接插入t1表
結果:可以使用Merge來實現此功能,測試如下:
CREATE TABLE dwsdata.t1 (
a1 INTEGER,
b1 INTEGER,
c1 INTEGER);
CREATE TABLE dwsdata.t2 (
a2 INTEGER,
b2 INTEGER,
c2 INTEGER);
select * from dwsdata.t1;
a1 b1 c1
1 1 1
2 2 2
3 3 3
select * from dwsdata.t2;
a2 b2 c2
1 2 2
2 3 3
4 5 5
MERGE INTO t1
USING t2
ON a1 = a2
WHEN MATCHED THEN
UPDATE SET b1 = b2,c1 = c2
WHEN NOT MATCHED THEN
INSERT (a2, b2, c2);
預期結果:
1 2 2
2 3 3
3 3 3
4 5 5
select * from dwsdata.t1;
a1 b1 c1
1 2 2
2 3 3
3 3 3
4 5 5