`
saraowner
  • 浏览: 5255 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
社区版块
存档分类
最新评论

oracle 带where条件的insert sql语句(megre 关键字)

阅读更多
转载,mark。很好

Sql代码 
1.Oracle9i引入了MERGE命令,你能够在一个SQL语句中对一个表同时执行inserts和updates操作. MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表.在Oracle 10g中MERGE有如下一些改进:  
2. 
3.1、UPDATE或INSERT子句是可选的  
4. 
5.2、UPDATE和INSERT子句可以加WHERE子句  
6. 
7.3、在ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表  
8. 
9.4、UPDATE子句后面可以跟DELETE子句来去除一些不需要的行  
10. 
11.首先创建示例表:  
12. 
13.create table PRODUCTS  
14.    (  
15.    PRODUCT_ID INTEGER,  
16.    PRODUCT_NAME VARCHAR2(60),  
17.    CATEGORY VARCHAR2(60)  
18.    );  
19. 
20.    insert into PRODUCTS values (1501, 'VIVITAR 35MM', 'ELECTRNCS');  
21.    insert into PRODUCTS values (1502, 'OLYMPUS IS50', 'ELECTRNCS');  
22.    insert into PRODUCTS values (1600, 'PLAY GYM', 'TOYS');  
23.    insert into PRODUCTS values (1601, 'LAMAZE', 'TOYS');  
24.    insert into PRODUCTS values (1666, 'HARRY POTTER', 'DVD');  
25.    commit;  
26. 
27.    create table NEWPRODUCTS  
28.    (  
29.    PRODUCT_ID INTEGER,  
30.    PRODUCT_NAME VARCHAR2(60),  
31.    CATEGORY VARCHAR2(60)  
32.    );  
33. 
34.    insert into NEWPRODUCTS values (1502, 'OLYMPUS CAMERA', 'ELECTRNCS');  
35.    insert into NEWPRODUCTS values (1601, 'LAMAZE', 'TOYS');  
36.    insert into NEWPRODUCTS values (1666, 'HARRY POTTER', 'TOYS');  
37.    insert into NEWPRODUCTS values (1700, 'WAIT INTERFACE', 'BOOKS');  
38.    commit;  
39. 
40.1、可省略的UPDATE或INSERT子句  
41. 
42.在Oracle 9i, MERGE语句要求你必须同时指定INSERT和UPDATE子句.而在Oracle 10g, 你可以省略UPDATE或INSERT子句中的一个. 下面的例子根据表NEWPRODUCTS的PRODUCT_ID字段是否匹配来updates表PRODUCTS的信息:  
43. 
44.SQL> MERGE INTO products p  
45.    2 USING newproducts np  
46.    3 ON (p.product_id = np.product_id)  
47.    4 WHEN MATCHED THEN 
48.    5 UPDATE 
49.    6 SET p.product_name = np.product_name,  
50.    7 p.category = np.category;  
51. 
52.    3 rows merged.  
53. 
54.    SQL> SELECT * FROM products;  
55. 
56.    PRODUCT_ID PRODUCT_NAME CATEGORY  
57.    ---------- -------------------- ----------  
58.    1501 VIVITAR 35MM ELECTRNCS  
59.    1502 OLYMPUS CAMERA ELECTRNCS  
60.    1600 PLAY GYM TOYS  
61.    1601 LAMAZE TOYS  
62.    1666 HARRY POTTER TOYS  
63.    SQL>  
64.    SQL> ROLLBACK;  
65.    Rollback complete.  
66.    SQL>  
67. 
68.在上面例子中, MERGE语句影响到是产品id为1502, 1601和1666的行. 它们的产品名字和种 类被更新为表newproducts中的值. 下面例子省略UPDATE子句, 把表NEWPRODUCTS中新的PRODUCT_ID插入到表PRODUCTS中, 对于在两个表中能够匹配上PRODUCT_ID的数据不作任何处理. 从这个例子你能看到PRODUCT_ID=1700的行被插入到表PRODUCTS中.  
69. 
70.SQL> MERGE INTO products p  
71.    2 USING newproducts np  
72.    3 ON (p.product_id = np.product_id)  
73.    4 WHEN NOT MATCHED THEN 
74.    5 INSERT 
75.    6 VALUES (np.product_id, np.product_name,  
76.    7 np.category);  
77. 
78.    1 row merged.  
79. 
80.    SQL> SELECT * FROM products;  
81. 
82.    PRODUCT_ID PRODUCT_NAME CATEGORY  
83.    ---------- -------------------- ----------  
84.    1501 VIVITAR 35MM ELECTRNCS  
85.    1502 OLYMPUS IS50 ELECTRNCS  
86.    1600 PLAY GYM TOYS  
87.    1601 LAMAZE TOYS  
88.    1666 HARRY POTTER DVD  
89.    1700 WAIT INTERFACE BOOKS  
90. 
91.2、带条件的Updates和Inserts子句  
92. 
93.你能够添加WHERE子句到UPDATE或INSERT子句中去, 来跳过update或insert操作对某些行的处理. 下面例子根据表NEWPRODUCTS来更新表PRODUCTS数据, 但必须字段CATEGORY也得同时匹配上:  
94. 
95.SQL> MERGE INTO products p  
96.    2 USING newproducts np  
97.    3 ON (p.product_id = np.product_id)  
98.    4 WHEN MATCHED THEN 
99.    5 UPDATE 
100.    6 SET p.product_name = np.product_name  
101.    7 WHERE p.category = np.category;  
102. 
103.    2 rows merged.  
104. 
105.    SQL> SELECT * FROM products;  
106. 
107.    PRODUCT_ID PRODUCT_NAME CATEGORY  
108.    ---------- -------------------- ----------  
109.    1501 VIVITAR 35MM ELECTRNCS  
110.    1502 OLYMPUS CAMERA ELECTRNCS  
111.    1600 PLAY GYM TOYS  
112.    1601 LAMAZE TOYS  
113.    1666 HARRY POTTER DVD  
114.    SQL>  
115.    SQL> rollback;  
116. 
117.在这个例子中, 产品ID为1502,1601和1666匹配ON条件但是1666的category不匹配. 因此MERGE命令只更新两行数据. 下面例子展示了在Updates和Inserts子句都使用WHERE子句:  
118. 
119.SQL> MERGE INTO products p  
120.    2 USING newproducts np  
121.    3 ON (p.product_id = np.product_id)  
122.    4 WHEN MATCHED THEN 
123.    5 UPDATE 
124.    6 SET p.product_name = np.product_name,  
125.    7 p.category = np.category  
126.    8 WHERE p.category = 'DVD' 
127.    9 WHEN NOT MATCHED THEN 
128.    10 INSERT 
129.    11 VALUES (np.product_id, np.product_name, np.category)  
130.    12 WHERE np.category != 'BOOKS' 
131.    SQL> /  
132. 
133.    1 row merged.  
134. 
135.    SQL> SELECT * FROM products;  
136. 
137.    PRODUCT_ID PRODUCT_NAME CATEGORY  
138.    ---------- -------------------- ----------  
139.    1501 VIVITAR 35MM ELECTRNCS  
140.    1502 OLYMPUS IS50 ELECTRNCS  
141.    1600 PLAY GYM TOYS  
142.    1601 LAMAZE TOYS  
143.    1666 HARRY POTTER TOYS  
144. 
145.    SQL>  
146. 
147.注意由于有WHERE子句INSERT没有插入所有不匹配ON条件的行到表PRODUCTS.  
148. 
149.3、无条件的Inserts  
150. 
151.你能够不用连接源表和目标表就把源表的数据插入到目标表中. 这对于你想插入所有行到目标表时是非常有用的. Oracle 10g现在支持在ON条件中使用常量过滤谓词. 举个常量过滤谓词例子ON (1=0). 下面例子从源表插入行到表PRODUCTS, 不检查这些行是否在表PRODUCTS中存在:  
152. 
153. 
154. 
155. 
156. 
157. 
158.SQL> MERGE INTO products p  
159.    2 USING newproducts np  
160.    3 ON (1=0)  
161.    4 WHEN NOT MATCHED THEN 
162.    5 INSERT 
163.    6 VALUES (np.product_id, np.product_name, np.category)  
164.    7 WHERE np.category = 'BOOKS' 
165.    SQL> /  
166. 
167.    1 row merged.  
168. 
169.    SQL> SELECT * FROM products;  
170. 
171.    PRODUCT_ID PRODUCT_NAME CATEGORY  
172.    ---------- -------------------- ----------  
173.    1501 VIVITAR 35MM ELECTRNCS  
174.    1502 OLYMPUS IS50 ELECTRNCS  
175.    1600 PLAY GYM TOYS  
176.    1601 LAMAZE TOYS  
177.    1666 HARRY POTTER DVD  
178.    1700 WAIT INTERFACE BOOKS  
179.    6 rows selected.  
180.    SQL>  
181. 
182.4、新增加的DELETE子句  
183. 
184.Oracle 10g中的MERGE提供了在执行数据操作时清除行的选项. 你能够在WHEN MATCHED THEN UPDATE子句中包含DELETE子句. DELETE子句必须有一个WHERE条件来删除匹配某些条件的行.匹配DELETE WHERE条件但不匹配ON条件的行不会被从表中删除.  
185. 
186.下面例子验证DELETE子句. 我们从表NEWPRODUCTS中合并行到表PRODUCTS中, 但删除category为ELECTRNCS的行.  
187. 
188.SQL> MERGE INTO products p  
189.    2 USING newproducts np  
190.    3 ON (p.product_id = np.product_id)  
191.    4 WHEN MATCHED THEN 
192.    5 UPDATE 
193.    6 SET p.product_name = np.product_name,  
194.    7 p.category = np.category  
195.    8 DELETE WHERE (p.category = 'ELECTRNCS')  
196.    9 WHEN NOT MATCHED THEN 
197.    10 INSERT 
198.    11 VALUES (np.product_id, np.product_name, np.category)  
199.    SQL> /  
200. 
201.    4 rows merged.  
202. 
203.    SQL> SELECT * FROM products;  
204. 
205.    PRODUCT_ID PRODUCT_NAME CATEGORY  
206.    ---------- -------------------- ----------  
207.    1501 VIVITAR 35MM ELECTRNCS  
208.    1600 PLAY GYM TOYS  
209.    1601 LAMAZE TOYS  
210.    1666 HARRY POTTER TOYS  
211.    1700 WAIT INTERFACE BOOKS  
212.    SQL>  
213. 
214.产品ID为1502的行从表PRODUCTS中被删除, 因为它同时匹配ON条件和DELETE WHERE条件. 产品ID为1501的行匹配DELETE WHERE条件但不匹配ON条件, 所以它没有被删除. 产品ID为1700 的行不匹配ON条件, 所以被插入表PRODUCTS. 产品ID为1601和1666的行匹配ON条件但不匹配DELETE WHERE条件, 所以被更新为表NEWPRODUCTS中的值.
分享到:
评论

相关推荐

    matlab口罩识别代码-MEGRE-Net:用于在多回波梯度回波(MEGRE)MRI图像中自动识别金基准标记的深度神经网络

    matlab口罩识别代码MEGRE网 用于在多回波梯度回波 MRI (MEGRE) 图像中自动识别金基准标记的深度神经网络。 该存储库包含 Jamtheim Gustafsson 等人在 2020 年 Phys 的出版物“基于深度学习的人工智能的开发和评估,...

    MSSQL产生死锁的根本原因及解决方法

    •请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放 •不剥夺条件:指进程已获得的资源,

    Gitlab Merge Roulette-crx插件

    语言:English chrome扩展将随机分配文件选择为gitlab合并请求功能 感觉幸运? 此扩展添加了一个按钮,可帮助您确定哪些同事将在Gitlab中查看您的合并请求。 只需在选项中添加您的私有令牌并旋转。

    Android代码-SortComparisonAlgorithms(Opensource)

    Sort Algorithm Visualization and comparison of ...Megre sort Cocktail sort It also compares the slow pace of the sorting algorithm Animate sort There are 2 types of data entry (click the gear ic

    Pattern Oriented Software Architecture volume2 - Patterns for Concurrent

    - **动态服务绑定**:运行时根据条件动态选择合适的服务实例进行绑定。 ##### 第3章:事件处理模式 - **事件监听器**:定义一组监听器接口,用于接收来自系统的事件通知。 - **事件队列**:将事件按照发生的顺序...

    Rainmeter分类快捷方式皮肤CrosslineShortcuts.rmskin

    这个快捷方式皮肤的特点是分类目录的形式, 背景来自一个叫"线性快捷"的皮肤. 点击左侧列的条目, 右侧列出该分类下的内容. 集合了我的电脑(硬盘使用状况), 库(Win7), USB弹出, 控制面板, 回收站(状况), 任务管理器等.

    Eclipse Java Development Tools API

    下列包的参考文档,从源码生成的。 org.eclipse.jdt.core org.eclipse.jdt.debug org.eclipse.jdt.junit org.eclipse.jdt.launching org.eclipse.jdt.ui

    ColorfulBlog2.0Setup.rar

    百度?新浪?CSDN?腾讯?网易?人人?搜狐?WordPress?……更美观的代码,ColorfulBlog为你呈现! ColorfulBlog支持20多种语言的高亮显示, 包含7个主题,有三种输出模式: ...对于支持HMTL较好的博客可选此模式;...

    代码高亮工具CodeHighlighter1.1.rar

    改进了1.01版, 大幅度减少了格式文本. 代码高亮工具, 博客贴代码用的. 支持弱弱的百度空间... 用SyntaxHighlighter实现, 支持20多种语言, 7个主题, 以及SyntaxHighlighter的常用选项. 离线编辑, 操作简单, 2步搞定

    代码高亮工具CodeHighlighter1.0

    《代码高亮工具CodeHighlighter1.0:提升博客代码展示质量》 在数字化的世界里,程序员和博主们经常需要在文章中展示源代码,以便分享技术知识或解决问题。然而,传统的文本编辑器往往无法有效地突出显示代码,使得...

    定时软件AutoShutdown2.0.rar, 仿360安全卫士界面, 可换肤

    综合了大多数定时软件的功能, 绿色软件, 无需安装. 功能简介: 1, 基本任务: 定时提醒/关机/重启/锁定/注销/睡眠/休眠, 可建立多个任务; 2, 任务重复: 一次/月/周/日/时/间隔(分钟); 3, 任务类型: 指定一个时间或倒计...

    MorningDiary0504(简体中文版).zip

    《晨间日记的奇迹》是一本提倡通过清晨写日记来提升个人效率和生活质量的书籍,而"MorningDiary0504(简体中文版).zip"则是一款与此书配套的电脑日记应用的简体中文版本。这款软件的出现,旨在帮助用户更好地实践书中...

    代码高亮工具CodeHighlighter 1.0

    代码高亮工具, 博客贴代码用的. 支持弱弱的百度空间(当然其他支持HTML的博客也可以). 用SyntaxHighlighter实现, 支持20多种语言, 7个主题, 以及SyntaxHighlighter的常用选项. 离线编辑, 操作简单, 2步搞定

    代码高亮工具 CodeHighlighter 1.01

    修改了1.0版长代码无法查看的bug, 添加了忙时图标. 代码高亮工具, 博客贴代码用的.... 用SyntaxHighlighter实现, 支持20多种语言, 7个主题, 以及SyntaxHighlighter的常用选项. 离线编辑, 操作简单, 2步搞定

    版本高亮工具CodeHighlighter版本1.11

    改进了1.1版: ... 增加了一键粘贴到编辑框; 重置时恢复最后一次编辑; 改进了界面; 代码高亮工具, 博客贴代码用的.... 用SyntaxHighlighter实现, 支持20多种语言, 7个主题, 以及SyntaxHighlighter的常用选项....

    MD5计算工具

    MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,由计算机科学家Rivest在1991年设计。它将任意长度的数据转化为一个固定长度的摘要,通常是32位的十六进制字符串。这个摘要具有唯一性和不可逆性,即...

    实用软件体系结构中文版(Applied Software Architecture )PDF

    Applied Software Architecture 中文版,PDF,Christine Hofmeister

    Pattern Oriented Software Architecture Volume 3 - Patterns for Resource

    ### Pattern Oriented Software Architecture Volume 3 - Patterns for Resource Management #### 标题解析与核心概念: 本书名为《面向模式的软件架构:资源管理模式》,是该系列书籍的第三卷,由Michael Kircher ...

Global site tag (gtag.js) - Google Analytics