暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

运维|popenGauss中的merge into(Oracle中merge into)

SmallDB 2024-06-21
66

学习目的

通过MERGE INTO语句,将目标表和源表中数据针对关联条件进行匹配,若关联条件匹配时对目标表进行UPDATE,无法匹配时对目标表执行INSERT。此语法可以很方便地用来合并执行UPDATE和INSERT,避免多次执行。

MERGE INTO
 是一种用于合并数据的SQL操作。MERGE INTO
 语句用于将一张表的数据合并到另一张表中,可以根据指定的条件来判断是执行插入、更新或删除操作

注意事项

  • • 进行MERGE INTO操作的用户需要同时拥有目标表的UPDATE和INSERT权限,以及源表的SELECT权限。

  • • 不支持重分布过程中MERGE INTO。

语法

openGauss=# \h merge
Command:     MERGE
Description: insert, update, or delete rows of a table based upon source data
Syntax:
MERGE [/*+ plan_hint */] INTO table_name [ partition_clause ] [ [ AS ] alias ]
USING { { table_name | view_name } | subquery } [ [ AS ] alias ]
ON ( condition )
[
  WHEN MATCHED THEN
  UPDATE SET { column_name = { expression | subquery | DEFAULT } |
          ( column_name [, ...] ) = ( { expression | subquery | DEFAULT } [, ...] ) } [, ...]
  [ WHERE condition ]
]
[
  WHEN NOT MATCHED THEN
  INSERT { DEFAULT VALUES |
  [ ( column_name [, ...] ) ] VALUES ( { expression | subquery | DEFAULT } [, ...] ) [, ...] [ WHERE condition ] }
];

where partition_clause can be:
PARTITION { ( partition_name ) | FOR ( partition_value [, ...] ) } |
SUBPARTITION { ( subpartition_name ) | FOR ( subpartition_value [, ...] ) }
NOTICE: 'partition_clause' is only avaliable in CENTRALIZED mode!
NOTICE: 'subquery' in the UPDATE and INSERT clauses are only avaliable in CENTRALIZED mode!

openGauss=#

示例

示例1

create table products(product_id int ,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');

结果

hu1=# select * from products;
 product_id | product_name | category
------------+--------------+-----------
       1501 | vivitar 35mm | electrncs
       1502 | olympus is50 | electrncs
       1600 | play gym     | toys
       1601 | lamaze       | toys
       1666 | harry potter | dvd
(5 rows)

示例2

create table newproducts(product_id int ,product_name varchar2(60),category varchar2(60));

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');

结果

hu1=# select * from newproducts;
 product_id |  product_name  | category
------------+----------------+-----------
       1502 | olympus camera | electrncs
       1601 | lamaze         | toys
       1666 | harry potter   | toys
       1700 | wait interface | books
(4 rows)

hu1=#

进行MERGE INTO操作

hu1=# MERGE INTO newproducts np USING products p
hu1-# ON(np.product_id = p.product_id)
hu1-# WHEN MATCHED THEN
hu1-#   UPDATE SET np.product_name = p.product_name, np.category = p.category
hu1-# WHEN NOT MATCHED THEN
hu1-#   INSERT VALUES (p.product_id, p.product_name, p.category) ;
MERGE 5
hu1=#

MERGE INTO newproducts np USING products p ON(np.product_id = p.product_id)  WHEN MATCHED THEN  UPDATE SET np.product_name = p.product_name, np.category = p.category WHEN NOT MATCHED THEN       INSERT VALUES (p.product_id, p.product_name, p.category) ;

查看结果

hu1=# select * from newproducts;
 product_id |  product_name  | category
------------+----------------+-----------
       1700 | wait interface | books
       1501 | vivitar 35mm   | electrncs
       1502 | olympus is50   | electrncs
       1600 | play gym       | toys
       1601 | lamaze         | toys
       1666 | harry potter   | dvd
(6 rows)

hu1=#

hu1=# select * from products;
 product_id | product_name | category
------------+--------------+-----------
       1501 | vivitar 35mm | electrncs
       1502 | olympus is50 | electrncs
       1600 | play gym     | toys
       1601 | lamaze       | toys
       1666 | harry potter | dvd
(5 rows)

hu1=#

建立数据库兼容列表

Command:     CREATE DATABASE
Description: create a new database
Syntax:
CREATE DATABASE [ IF NOT EXISTS ] database_name
    [ [ WITH ] {[ OWNER [=] user_name ]|
           [ TEMPLATE [=] template ]|
           [ ENCODING [=] encoding ]|
           [ LC_COLLATE [=] lc_collate ]|
           [ LC_CTYPE [=] lc_ctype ]|
           [ DBCOMPATIBILITY [=] compatibility_type ]|
           [ TABLESPACE [=] tablespace_name ]|
           [ CONNECTION LIMIT [=] connlimit ]}[...] ];

结论

MERGE INTO 后面是操作的表(newproducts),被操作的表(USING products p),把符合条件的products里面的记录同步到newproducts中 MERGE INTO 这个语法源于Oracle,可是国产化的过程中,O的数据库比较多,所以popenGauss也实现这个语法 与MySQL的ON DUPLICATE KEY操作差不多,只是在语法上支持的更多了

以上数据参考互联网的数据,自己造数据太麻烦了,如果有冲突联系我删除


文章转载自SmallDB,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论