【Databend】merge 的用法

简介: 【Databend】merge 的用法

概述

merge 关键字它能使用指定来源的数据,对目标表中的行执行 insert 、update 或 delete 操作,所有这些都符合语句中指定的条件和匹配标准。

基础语法:

merge into target_table
using source_table
on condition
when matched [and <condition>] then 
operation
when not matched [and <condition>] then 
operation;

其中最后语句分号不可以省略,且源表既可以是一个表也可以是一个子查询语句。


merge 语句通常包含 matched 或 not matched 子句,对应如何处理匹配和不匹配的场景。对于匹配子句,您可以选择在目标表上执行更新或删除操作之间进行选择。相反,在不匹配子句的情况下,可用的选择是 insert 。


因此,应用场景有数据同步和基于源表对目标表做 insert 、update 或 delete 操作。


当源表和目标表不匹配时:


若数据是源表有目标表没有,则进行插入操作;

若数据是源表没有而目标表有,则进行更新或者删除数据操作

当源表和目标表匹配时:


进行更新操作或者删除操作。

merge无法多次更新同一行,也无法更新和删除同一行。


merge 还有一些使用限制:


在 merge matched 操作中,只能允许执行 update 或者 delete 语句,并且只能出现一次,否则报错。

在 merge not matched 操作中,只允许执行 insert 语句。

数据准备

准备以下三个表用于测试。

drop table if exists employees;
create table if not exists employees (
    employee_id int,
    employee_name varchar(255),
    department varchar(255)
);
drop table if exists salaries;
create table if not exists salaries (
    employee_id int,
    salary decimal(10, 2)
);

drop table if exists target_table;
create table if not exists target_table (
    id int,
    name varchar(50),
    age int,
    city varchar(50)
);


insert into employees values
    (1, 'Alice', 'HR'),
    (2, 'Bob', 'IT'),
    (3, 'Charlie', 'Finance'),
    (4, 'David', 'HR');

insert into salaries values
    (1, 50000.00),
    (2, 60000.00);

insert into target_table (id, name, age, city) values
    (1, 'Alice', 25, 'Toronto'),
    (2, 'Bob', 30, 'Vancouver'),
    (3, 'Carol', 28, 'Montreal');
    
-- 开启 merge 功能
set enable_experimental_merge_into = 1;

应用示例

需求是将“员工”的员工数据同步到“工资”,允许根据指定标准插入和更新工资信息

merge into salaries 
    using (select * from employees) as employees
    on salaries.employee_id = employees.employee_id
    when matched and employees.department = 'HR' then
update set
    salaries.salary = salaries.salary + 1000.00
    when matched then
update set
    salaries.salary = salaries.salary + 500.00
    when not matched then
insert (employee_id, salary)
    values
    (employees.employee_id, 55000.00);

同步数据

create table if not exists target_table like target_table;
-- 同步全量数据
merge into target_table as t
    using (select * from source_table) as s
    on t.id = s.id
    when matched then
update *
    when not matched then
insert *;

总结

merge 用法功能比较丰富,这里只是简单应用,如果想了解更多,可以搜索手动实践。在我们要对表做多种操作时,这种写法不仅可以节省代码,而且有时候还可以提高执行效率。

参考资料:

相关文章
|
6月前
|
Java 关系型数据库 MySQL
实时计算 Flink版操作报错合集之在使用批处理模式中使用flat_aggregate函数时报错,该如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
8月前
|
SQL 机器学习/深度学习 分布式计算
MaxCompute产品使用合集之sql代码中支持插入jinja语法语句吗
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
8月前
|
SQL 机器学习/深度学习 分布式计算
MaxCompute产品使用合集之在进行全表扫描而不加分区,如何设置语句
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
9月前
|
SQL XML JSON
Hive函数全解——思维导图 + 七种函数类型
Hive函数全解——思维导图 + 七种函数类型
178 2
Hive函数全解——思维导图 + 七种函数类型
|
9月前
|
自然语言处理 索引
es-DSL语句基础操作(Elasticseach)
es-DSL语句基础操作(Elasticseach)
197 1
|
9月前
|
存储 监控 数据库
Flink CDC产品常见问题之Lookup Join之后再分组聚合部分数据从零开始如何解决
Flink CDC(Change Data Capture)是一个基于Apache Flink的实时数据变更捕获库,用于实现数据库的实时同步和变更流的处理;在本汇总中,我们组织了关于Flink CDC产品在实践中用户经常提出的问题及其解答,目的是辅助用户更好地理解和应用这一技术,优化实时数据处理流程。
|
SQL Oracle 关系型数据库
【SQL开发实战技巧】系列(四):从执行计划讨论UNION ALL与空字符串&UNION与OR的使用注意事项
本篇文章讲解的主要内容是:***有重复数据的数据集用UNION后得到的数据与预期不一致如何解决,当两个表中有重复数据时,UNION的去重功能被忽略,UNION过程中如何识别展示出来、空值与空字符串的关系以及在UNION ALL中的使用、UNION与OR可以互相改写以及使用中的注意事项。***
【SQL开发实战技巧】系列(四):从执行计划讨论UNION ALL与空字符串&UNION与OR的使用注意事项
|
Arthas Java 测试技术
Trace 命令的语法和案例 | 学习笔记
快速学习 Trace 命令的语法和案例
Trace 命令的语法和案例 | 学习笔记
|
数据库 开发者 索引
merge 操作|学习笔记
快速学习 merge 操作
220 0
merge 操作|学习笔记
|
SQL 数据挖掘 数据库
DataFrame多表合并拼接函数concat、merge参数详解+代码操作展示
DataFrame多表合并拼接函数concat、merge参数详解+代码操作展示
889 0
DataFrame多表合并拼接函数concat、merge参数详解+代码操作展示