• BI-SQL丨MEGRE


    MEGRE

    MEGRE语句,在SQL的生态圈中,一直都隶属于一个比较重要的位置。

    要知道,在实际的项目应用中,我们经常需要从上游数据源,进行原始数据的抽取、清洗、存储、分析等操作,特别是在存储这一环节,MEGRE的作用尤为突出。

    举个例子:

    我们需要完成对上游维度信息的抽取,根据我们的设定,数仓在每日执行抽取任务之前,需要对数仓已有的维度信息进行判断,如果已有的,要核对是否与最新的数据相匹配,不匹配则进行更新操作;如果是没有的,则需要执行插入操作。

    常规的实现方法需要分别编写SQL语句进行条件判断,分别执行更新和插入操作,这样会显得代码非常的臃肿,性能也不是特别好,针对这种情况,使用MEGRE语句尤为的适合。

    函数介绍

    MEGRE语法如下:

    MERGE 目标表
    USING 源表
    ON 匹配条件
    WHEN MATCHED
    THEN 语句
    WHEN NOT MATCHED BY TARGET --如何和目标表不匹配
    THEN 语句
    WHEN NOT MATCHED BY SOURCE --如何和源表不匹配
    THEN 语句;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    注意:

    1.最后语句的分号不可以被省略;

    2.源表可以是一个物理表,也可以是一个子查询语句。

    使用实例

    案例数据:

    在白茶本机的数据库中,存在名为”CaseData”的数据库,执行下面的语句,生成我们需要的源表和目标表。

    CREATE TABLE TargetTable (
        UserID INT PRIMARY KEY,
        UserName VARCHAR(255) NOT NULL,
        Amount DECIMAL(10, 2)
    );
    INSERT INTO TargetTable(UserID, UserName, Amount)
    VALUES(1, '张三', 15000),
          (2, '李四', 25000),
          (3, '王五', 13000),
          (4, '陈六', 10000);
    --------------上面生成目标表,下面生成源表--------------
    CREATE TABLE SourceTable (
        UserID INT PRIMARY KEY,
        UserName VARCHAR(255) NOT NULL,
        Amount DECIMAL(10, 2)
    );
    INSERT INTO SourceTable(UserID, UserName, Amount)
    VALUES(1, '张三', 15000),
          (3, '王五', 14000),
          (4, '陈六', 20000),
          (5, '赵七', 10000),
          (6, '钱九', 10000);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    结果如下:

    我们来查看一下表的数据。

    假设TargetTable表是数仓目前已有的数据,SourceTable表是每日更新的上游数据,我们现在要根据SourceTable表对TargetTable进行数据更新。

    更新规则如下:

    1.若TargetTable表和SourceTable表都有的数据,则需要更新为SourceTable表中的记录;

    2.若TargetTable表有的记录,且SourceTable表没有,则这些记录需要被清除掉;

    3.若TargetTable表没有记录,且SourceTable表有,则需要将SourceTable表中的记录插入到TargetTable表中。

    根据上述要求,我们可以编辑如下SQL语句:

    MERGE TargetTable
    USING SourceTable
    ON (TargetTable.UserID = SourceTable.UserID)
    WHEN MATCHED THEN
    UPDATE
    SET TargetTable.UserName = SourceTable.UserName,
        TargetTable.Amount = SourceTable.Amount
    WHEN NOT MATCHED BY TARGET THEN
    INSERT (UserID, UserName, Amount)
    VALUES (
            SourceTable.UserID,
            SourceTable.UserName,
            SourceTable.Amount
        )
    WHEN NOT MATCHED BY SOURCE THEN 
    DELETE;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    结果如下:

    在这里插入图片描述

    在这里插入图片描述

    这里是白茶,一个PowerBI的初学者。

  • 相关阅读:
    网游服务器怎么选择
    软件开发项目文档系列之十三如何撰写用户操作手册
    详解删除链表的倒数第N个结点
    数据结构——栈和队列
    5-什么是猴子补丁,有什么用途?什么是反射,python中如何使用反射?http和https的区别?
    5.Vue2-模板语法
    PHP 变量学习资料
    Spring Boot中实现订单30分钟自动取消的策略
    Redis的延时队列
    抖音短视频评论区怎么展现店铺?珠珠来告诉你!
  • 原文地址:https://blog.csdn.net/sterln/article/details/128158542