【问题标题】:Combining Bigquery Delete and Insert Statements结合 Bigquery Delete 和 Insert 语句
【发布时间】:2020-01-23 19:02:29
【问题描述】:

Bigquery 中有没有办法将 DELETEINSERT 语句合并为一个

DELETE `my_project.my_dataset.demo` 
WHERE date= CURRENT_DATE()

INSERT INTO
 `my_project.my_dataset.demo` 
SELECT * FROM `my_project.my_dataset.my_source` 
WHERE date= CURRENT_DATE()

有什么语句可以将以上两种DML合二为一?

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    MERGE:

    MERGE 语句是一种 DML 语句,它可以将 INSERT、UPDATE 和 DELETE 操作组合成一条语句并以原子方式执行这些操作。

    在以下示例中,NewArrivals 表中的所有产品都替换为子查询中的值。 INSERT 子句没有为目标表或源子查询指定列名。

    MERGE dataset.NewArrivals
    USING (SELECT * FROM UNNEST([('microwave', 10, 'warehouse #1'),
                                 ('dryer', 30, 'warehouse #1'),
                                 ('oven', 20, 'warehouse #2')]))
    ON FALSE
    WHEN NOT MATCHED THEN
      INSERT ROW
    WHEN NOT MATCHED BY SOURCE THEN
      DELETE
    

    【讨论】:

    • 不错,但是这个解决方案仍然不像删除插入操作,通过匹配键,您首先删除目标中与暂存表匹配的所有行,然后将暂存的所有行插入到目标。例如,如果要替换与相同日期匹配的目标表行。
    【解决方案2】:

    我稍微修改了 Felipe 的回答来处理这个用例。唯一需要更改的是在 WHEN NOT MATCHED 语句中添加一个额外的子句:

    MERGE `my_project.my_dataset.demo`
    USING (SELECT * from `my_project.my_dataset.my_source` WHERE date=CURRENT_DATE())
    
    ON 1=2  /* exactly the same as ON FALSE, but slightly clearer */
    WHEN NOT MATCHED BY SOURCE AND date=CURRENT_DATE() THEN
      DELETE
    WHEN NOT MATCHED BY TARGET THEN
      INSERT ROW
    

    了解正在发生的事情的关键是我们在条件 1=2 上进行匹配——也就是说,我们将永远匹配。但是我们可以在 NOT MATCHED 子句中添加额外的条件。

    • WHEN NOT MATCHED BY SOURCE 是现有表中的每条记录。
    • WHEN NOT MATCHED BY SOURCE AND (whatever) 是现有表中与“whatever”子句匹配的每条记录
    • WHEN NOT MATCHED BY TARGET 是传入数据中的每条记录

    【讨论】:

      猜你喜欢
      • 2016-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-16
      • 2019-05-12
      相关资源
      最近更新 更多