统一SQL merge into 支持 insert 在 update 顺序之前用法

统一SQL介绍

详见:统一SQL参考手册

背景

Oracle官方语法图中merge into 用法中merge_update_clause是在merge_insert_clause之前,如下图。

oracle官方链接:MERGE

备注:语法图顺序虽如此但是oracle自身支持merge_insert_clause在merge_update_clause之前用法。

统一SQL支持

针对于上述背景统一SQL对merge into 做了语法支持,支持 merge_insert_clause 在  merge_update_clause 顺序之前用法。

备注:经过统一SQL转换后 merge_update_clause 还是在 merge_insert_clause 顺序之前,保持语义的一致性。

  • 使用案例 oracle2lightdb_oracle
    
    -- 初始化表结构
    CREATE TABLE unisql_people_source ( 
    person_id  INTEGER NOT NULL PRIMARY KEY, 
    first_name VARCHAR2(20) NOT NULL, 
    last_name  VARCHAR2(20) NOT NULL, 
    title      VARCHAR2(10) NOT NULL 
    );

    DROP TABLE unisql_people_target;
    CREATE TABLE unisql_people_target ( 
    person_id  INTEGER NOT NULL PRIMARY KEY, 
    first_name VARCHAR2(20) NOT NULL, 
    last_name  VARCHAR2(20) NOT NULL, 
    title      VARCHAR2(10) NOT NULL 
    );

    INSERT INTO unisql_people_target VALUES (1, 'John', 'Smith', 'Mr');
    INSERT INTO unisql_people_target VALUES (2, 'alice', 'jones', 'Mrs');
    INSERT INTO unisql_people_source VALUES (2, 'Alice', 'Jones', 'Mrs.');
    INSERT INTO unisql_people_source VALUES (3, 'Jane', 'Doe', 'Miss');
    INSERT INTO unisql_people_source VALUES (4, 'Dave', 'Brown', 'Mr');    

    -- 转换前Oracle SQL:
    MERGE INTO unisql_people_target pt 
    USING unisql_people_source ps 
    ON (pt.person_id = ps.person_id) 
    WHEN MATCHED THEN 
    UPDATE SET pt.first_name = ps.first_name, 
        pt.last_name = ps.last_name, 
        pt.title = ps.title
    WHEN NOT MATCHED THEN 
    INSERT (pt.person_id, pt.first_name, pt.last_name, pt.title) 
    VALUES (ps.person_id, ps.first_name, ps.last_name, ps.title);

    -- 转换后LightDB-Oracle SQL:
    MERGE INTO unisql_people_target AS pt 
    USING unisql_people_source AS ps 
    ON (pt.person_id=ps.person_id) 
    WHEN MATCHED THEN UPDATE SET pt.first_name=ps.first_name,pt.last_name=ps.last_name,pt.title=ps.title 
    WHEN NOT MATCHED THEN INSERT (pt.person_id,pt.first_name,pt.last_name,pt.title) VALUES (ps.person_id,ps.first_name,ps.last_name,ps.title)


    -- 查询表数据
    SELECT * FROM unisql_people_target;
    PERSON_ID|FIRST_NAME|LAST_NAME|TITLE|
    ---------+----------+---------+-----+
            1|John      |Smith    |Mr   |
            2|Alice     |Jones    |Mrs. |
            3|Jane      |Doe      |Miss |
            4|Dave      |Brown    |Mr   |




    -- merge_insert_clause 在 merge_update_clause 顺序之前用法
    -- 转换前Oracle SQL:
    MERGE INTO unisql_people_target pt 
    USING unisql_people_source ps 
    ON (pt.person_id = ps.person_id) 
    WHEN NOT MATCHED THEN 
    INSERT (pt.person_id, pt.first_name, pt.last_name, pt.title) 
    VALUES (ps.person_id, ps.first_name, ps.last_name, ps.title)
    WHEN MATCHED THEN 
    UPDATE SET pt.first_name = ps.first_name, 
        pt.last_name = ps.last_name, 
        pt.title = ps.title;

    -- 转换后LightDB-Oracle SQL:
    MERGE INTO unisql_people_target AS pt 
    USING unisql_people_source AS ps 
    ON (pt.person_id=ps.person_id) 
    WHEN MATCHED THEN UPDATE SET pt.first_name=ps.first_name,pt.last_name=ps.last_name,pt.title=ps.title 
    WHEN NOT MATCHED THEN INSERT (pt.person_id,pt.first_name,pt.last_name,pt.title) VALUES (ps.person_id,ps.first_name,ps.last_name,ps.title)

Oracle到其余信创数据库的转换用法请参考:

统一SQL参考手册

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值