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. ;
  7. condition:
  8. valid JOIN condition
  9. subquery:
  10. merge_update_clause:
  11. WHEN MATCHED THEN UPDATE SET
  12. column_name = expr [,...]
  13. [ WHERE update_condition ]
  14. [ DELETE WHERE delete_condition ]
  15. merge_insert_clause:
  16. WHEN NOT MATCHED THEN INSERT
  17. [ ( column_name [,...] ) ]
  18. VALUES ( expr [,...] )
  19. [ 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);
  6. greatsql> CREATE TABLE t2(
  7. id BIGINT(10),
  8. name VARCHAR(16),
  9. sale BIGINT(20),
  10. UNIQUE KEY `idx_id` (`id`));
  11. greatsql> INSERT INTO t1 VALUES(1, 'Cindy', 1000, 1000), (2, 'James', 500, 1000);
  12. greatsql> INSERT INTO t2 VALUES(1, 'Cindy', 300), (2, 'James', 400), (3, 'John', 900),(4, 'Peter', 1200);
  13. greatsql> SELECT * FROM t1;
  14. +----+-------+------+-----------+
  15. | id | name | sale | operatime |
  16. +----+-------+------+-----------+
  17. | 1 | Cindy | 1000 | 1000 |
  18. | 2 | James | 500 | 1000 |
  19. +----+-------+------+-----------+
  20. 2 rows in set (0.00 sec)
  21. greatsql> SELECT * FROM t2;
  22. +------+-------+------+
  23. | id | name | sale |
  24. +------+-------+------+
  25. | 1 | Cindy | 300 |
  26. | 2 | James | 400 |
  27. | 3 | John | 900 |
  28. | 4 | Peter | 1200 |
  29. +------+-------+------+
  30. 4 rows in set (0.00 sec)
  31. greatsql> MERGE INTO t1
  32. USING t2
  33. ON ( t2.id = t1.id )
  34. WHEN MATCHED THEN
  35. UPDATE SET
  36. t1.name = t2.name,
  37. t1.sale = t2.sale + t1.id + 20
  38. WHERE 1 = 1
  39. WHEN NOT MATCHED THEN
  40. INSERT
  41. VALUES (t2.id, t2.name, t2.sale + t2.id + 10, 1020);
  42. Query OK, 4 rows affected (0.00 sec)
  43. Rows matched: 2 Changed: 2 Inserted: 2 Deleted: 0 Warnings: 0
  44. greatsql> SELECT * FROM t1;
  45. +----+-------+------+-----------+
  46. | id | name | sale | operatime |
  47. +----+-------+------+-----------+
  48. | 1 | Cindy | 321 | 1000 |
  49. | 2 | James | 422 | 1000 |
  50. | 3 | John | 913 | 1020 |
  51. | 4 | Peter | 1214 | 1020 |
  52. +----+-------+------+-----------+
  53. greatsql> DELETE FROM t1 WHERE id > 2;
  54. greatsql> MERGE INTO t1
  55. USING t2
  56. ON ( t2.id = t1.id )
  57. WHEN MATCHED THEN
  58. UPDATE SET
  59. t1.name = t2.name,
  60. t1.sale = t2.sale + t1.id + 30;
  61. Query OK, 2 rows affected (0.00 sec)
  62. Rows matched: 2 Changed: 2 Inserted: 0 Deleted: 0 Warnings: 0
  63. greatsql> SELECT * FROM t1;
  64. +----+-------+------+-----------+
  65. | id | name | sale | operatime |
  66. +----+-------+------+-----------+
  67. | 1 | Cindy | 331 | 1000 |
  68. | 2 | James | 432 | 1000 |
  69. +----+-------+------+-----------+
  70. greatsql> MERGE INTO t1
  71. USING t2
  72. ON ( t2.id = t1.id )
  73. WHEN MATCHED THEN
  74. UPDATE SET
  75. t1.name = t2.name,
  76. t1.sale = t2.sale + t1.id + 40;
  77. Query OK, 2 rows affected (0.00 sec)
  78. Rows matched: 2 Changed: 2 Inserted: 0 Deleted: 0 Warnings: 0
  79. greatsql> SELECT * FROM t1;
  80. +----+-------+------+-----------+
  81. | id | name | sale | operatime |
  82. +----+-------+------+-----------+
  83. | 1 | Cindy | 341 | 1000 |
  84. | 2 | James | 442 | 1000 |
  85. +----+-------+------+-----------+
  86. greatsql> MERGE INTO t1
  87. USING t2
  88. ON ( t2.id = t1.id )
  89. WHEN NOT MATCHED THEN
  90. INSERT
  91. VALUES (t2.id, t2.name, t2.sale + t2.id + 10, 3000);
  92. Query OK, 2 rows affected (0.00 sec)
  93. Rows matched: 0 Changed: 0 Inserted: 2 Deleted: 0 Warnings: 0
  94. greatsql> SELECT * FROM t1;
  95. +----+-------+------+-----------+
  96. | id | name | sale | operatime |
  97. +----+-------+------+-----------+
  98. | 1 | Cindy | 341 | 1000 |
  99. | 2 | James | 442 | 1000 |
  100. | 3 | John | 913 | 3000 |
  101. | 4 | Peter | 1214 | 3000 |
  102. +----+-------+------+-----------+
  103. 4 rows in set (0.00 sec)
  104. greatsql> DELETE FROM t1 WHERE id > 2;
  105. Query OK, 2 rows affected (0.00 sec)
  106. greatsql> MERGE INTO t1
  107. USING t2
  108. ON ( t2.id = t1.id )
  109. WHEN NOT MATCHED THEN
  110. INSERT
  111. (t1.id, t1.name, t1.sale, t1.operatime)
  112. VALUES
  113. (t2.id, t2.name, t2.sale + t2.id + 10, 4000);
  114. Query OK, 2 rows affected (0.00 sec)
  115. Rows matched: 0 Changed: 0 Inserted: 2 Deleted: 0 Warnings: 0
  116. greatsql> SELECT * FROM t1;
  117. +----+-------+------+-----------+
  118. | id | name | sale | operatime |
  119. +----+-------+------+-----------+
  120. | 1 | Cindy | 341 | 1000 |
  121. | 2 | James | 442 | 1000 |
  122. | 3 | John | 913 | 4000 |
  123. | 4 | Peter | 1214 | 4000 |
  124. +----+-------+------+-----------+
  125. 4 rows in set (0.00 sec)

问题反馈

联系我们

扫码关注微信公众号

greatsql-wx