Oracle兼容-语法-MERGE INTO
1. 语法
1. MERGE INTO target_tab_name [tab_alias]
2. USING { tab_name | view | subquery } [tab_alias]
3. ON ( condition )
4. [ merge_update_clause ]
5. [ merge_insert_clause ]
6. ;
8. condition:
9. valid JOIN condition
11. subquery:
13. merge_update_clause:
14. WHEN MATCHED THEN UPDATE SET
15. column_name = expr [,...]
16. [ WHERE update_condition ]
17. [ DELETE WHERE delete_condition ]
19. merge_insert_clause:
20. WHEN NOT MATCHED THEN INSERT
21. [ ( column_name [,...] ) ]
22. VALUES ( expr [,...] )
23. [ WHERE insert_condition ]
2. 定义和用法
MERGE INTO 相当于 UPDATE target_tab_name RIGHT OUTER JOIN tab_name ON (condition),当 target_tab_name 有相应匹配的数据时,就执行 merge_update_clause 子句;若无匹配数据时,则执行 merge_insert_clause 子句。
update_condition是根据更新前的内容来运算。当运算结果为真时,才会更新。delete_condition是根据更新后的内容来运算。当运算结果为真时,才会刪除。insert_condition是根据更新前的内容来运算。当运算结果为真时,才会插入新内容。
3. Oracle兼容说明
在原生 UPDATE ... RIGHT OUTER JOIN ON 的基础上,实现 MERGE INTO 语法兼容。但有以下限制:
- 对象
target_tab_name必须是基本表,不可以是视图或派生表。 - 不支持
EXPLAIN。 - 在触发器(
trigger) 内,无法禁止更新ON子句所引用的列。
4. 示例
1. greatsql> CREATE TABLE t1 (
2. id BIGINT(10) PRIMARY KEY,
3. name VARCHAR(16),
4. sale BIGINT(10),
5. operatime BIGINT);
7. greatsql> CREATE TABLE t2(
8. id BIGINT(10),
9. name VARCHAR(16),
10. sale BIGINT(20),
11. UNIQUE KEY `idx_id` (`id`));
13. greatsql> INSERT INTO t1 VALUES(1, 'Cindy', 1000, 1000), (2, 'James', 500, 1000);
15. greatsql> INSERT INTO t2 VALUES(1, 'Cindy', 300), (2, 'James', 400), (3, 'John', 900),(4, 'Peter', 1200);
17. greatsql> SELECT * FROM t1;
18. +----+-------+------+-----------+
19. | id | name | sale | operatime |
20. +----+-------+------+-----------+
21. | 1 | Cindy | 1000 | 1000 |
22. | 2 | James | 500 | 1000 |
23. +----+-------+------+-----------+
24. 2 rows in set (0.00 sec)
26. greatsql> SELECT * FROM t2;
27. +------+-------+------+
28. | id | name | sale |
29. +------+-------+------+
30. | 1 | Cindy | 300 |
31. | 2 | James | 400 |
32. | 3 | John | 900 |
33. | 4 | Peter | 1200 |
34. +------+-------+------+
35. 4 rows in set (0.00 sec)
37. greatsql> MERGE INTO t1
38. USING t2
39. ON ( t2.id = t1.id )
40. WHEN MATCHED THEN
41. UPDATE SET
42. t1.name = t2.name,
43. t1.sale = t2.sale + t1.id + 20
44. WHERE 1 = 1
45. WHEN NOT MATCHED THEN
46. INSERT
47. VALUES (t2.id, t2.name, t2.sale + t2.id + 10, 1020);
48. Query OK, 4 rows affected (0.00 sec)
49. Rows matched: 2 Changed: 2 Inserted: 2 Deleted: 0 Warnings: 0
51. greatsql> SELECT * FROM t1;
52. +----+-------+------+-----------+
53. | id | name | sale | operatime |
54. +----+-------+------+-----------+
55. | 1 | Cindy | 321 | 1000 |
56. | 2 | James | 422 | 1000 |
57. | 3 | John | 913 | 1020 |
58. | 4 | Peter | 1214 | 1020 |
59. +----+-------+------+-----------+
61. greatsql> DELETE FROM t1 WHERE id > 2;
63. greatsql> MERGE INTO t1
64. USING t2
65. ON ( t2.id = t1.id )
66. WHEN MATCHED THEN
67. UPDATE SET
68. t1.name = t2.name,
69. t1.sale = t2.sale + t1.id + 30;
70. Query OK, 2 rows affected (0.00 sec)
71. Rows matched: 2 Changed: 2 Inserted: 0 Deleted: 0 Warnings: 0
73. greatsql> SELECT * FROM t1;
74. +----+-------+------+-----------+
75. | id | name | sale | operatime |
76. +----+-------+------+-----------+
77. | 1 | Cindy | 331 | 1000 |
78. | 2 | James | 432 | 1000 |
79. +----+-------+------+-----------+
81. greatsql> MERGE INTO t1
82. USING t2
83. ON ( t2.id = t1.id )
84. WHEN MATCHED THEN
85. UPDATE SET
86. t1.name = t2.name,
87. t1.sale = t2.sale + t1.id + 40;
88. Query OK, 2 rows affected (0.00 sec)
89. Rows matched: 2 Changed: 2 Inserted: 0 Deleted: 0 Warnings: 0
91. greatsql> SELECT * FROM t1;
92. +----+-------+------+-----------+
93. | id | name | sale | operatime |
94. +----+-------+------+-----------+
95. | 1 | Cindy | 341 | 1000 |
96. | 2 | James | 442 | 1000 |
97. +----+-------+------+-----------+
99. greatsql> MERGE INTO t1
100. USING t2
101. ON ( t2.id = t1.id )
102. WHEN NOT MATCHED THEN
103. INSERT
104. VALUES (t2.id, t2.name, t2.sale + t2.id + 10, 3000);
105. Query OK, 2 rows affected (0.00 sec)
106. Rows matched: 0 Changed: 0 Inserted: 2 Deleted: 0 Warnings: 0
108. greatsql> SELECT * FROM t1;
109. +----+-------+------+-----------+
110. | id | name | sale | operatime |
111. +----+-------+------+-----------+
112. | 1 | Cindy | 341 | 1000 |
113. | 2 | James | 442 | 1000 |
114. | 3 | John | 913 | 3000 |
115. | 4 | Peter | 1214 | 3000 |
116. +----+-------+------+-----------+
117. 4 rows in set (0.00 sec)
119. greatsql> DELETE FROM t1 WHERE id > 2;
120. Query OK, 2 rows affected (0.00 sec)
122. greatsql> MERGE INTO t1
123. USING t2
124. ON ( t2.id = t1.id )
125. WHEN NOT MATCHED THEN
126. INSERT
127. (t1.id, t1.name, t1.sale, t1.operatime)
128. VALUES
129. (t2.id, t2.name, t2.sale + t2.id + 10, 4000);
130. Query OK, 2 rows affected (0.00 sec)
131. Rows matched: 0 Changed: 0 Inserted: 2 Deleted: 0 Warnings: 0
133. greatsql> SELECT * FROM t1;
134. +----+-------+------+-----------+
135. | id | name | sale | operatime |
136. +----+-------+------+-----------+
137. | 1 | Cindy | 341 | 1000 |
138. | 2 | James | 442 | 1000 |
139. | 3 | John | 913 | 4000 |
140. | 4 | Peter | 1214 | 4000 |
141. +----+-------+------+-----------+
142. 4 rows in set (0.00 sec)
问题反馈
联系我们
扫码关注微信公众号

