【发布时间】:2021-08-26 10:44:59
【问题描述】:
我通常很高兴使用 sql 合并(使用 google bigquery 及其 sql 版本,但我认为这个问题是通用的)。但是,我有一个我无法通过合并解决的用例。
我有一个源表 s 和一个目标表 t。他们都有一个名为“day”的字段。我想从 t 中删除所有包含 s 中的日期的行。然后我想在 t 中插入 s 中的所有行。
不使用合并,我可以使用两个语句来完成:
delete from t where day in (select day from s);
insert into t (select * from s);
但是,我想使用合并将其作为单个语句来完成。 我最大的努力是这个
merge t
using s
on false
when not matched by target then
insert row
when not matched by source and t.day between
(select min(day) from s) and (select max(day) from s)
then delete
只要 s 中的日期形成一个连续的间隔,它就可以正常工作。然而,对于任意日期,它显然从 t 中删除了太多。我试过了
merge t
using s
on false
when not matched by target then
insert row
when not matched by source and t.day in
(select day from s)
但是在 bigquery 中不允许最后的子查询。我得到了错误
google.api_core.exceptions.BadRequest: 400 Correlated Subquery is unsupported in WHEN clause.
有人可以帮忙吗?这似乎是一个非常简单的操作,但我根本无法编写正确的合并语句。
【问题讨论】:
标签: sql merge google-bigquery