在 Bigquery 中连接表,其中仅更新新字符串

Posted

技术标签:

【中文标题】在 Bigquery 中连接表,其中仅更新新字符串【英文标题】:Join tables in Bigquery where only new strings are updated 【发布时间】:2018-02-02 18:03:02 【问题描述】:

我有以下两个数据表:

╔═════════╦══════════╦════════╦══════════╗
║ Keyword ║ Category ║ Amount ║  Update  ║
╠═════════╬══════════╬════════╬══════════╣
║ dog     ║ Animal   ║      2 ║ 1/1/2018 ║
║ fish    ║ Animal   ║      4 ║ 1/1/2018 ║
║ cat     ║ Animal   ║      5 ║ 1/1/2018 ║
║ bird    ║ Animal   ║      7 ║ 1/1/2018 ║
║ bike    ║ Other    ║      1 ║ 1/1/2018 ║
║ rabbit  ║ Animal   ║     11 ║ 1/1/2018 ║
╚═════════╩══════════╩════════╩══════════╝


╔═════════╦══════════╦════════╦══════════╗
║ Keyword ║ Category ║ Amount ║  Update  ║
╠═════════╬══════════╬════════╬══════════╣
║ lion    ║ Animal   ║      2 ║ 1/2/2018 ║
║ snake   ║ Animal   ║      9 ║ 1/2/2018 ║
║ cat     ║ Animal   ║     18 ║ 1/2/2018 ║
║ bird    ║ Animal   ║     13 ║ 1/2/2018 ║
║ bike    ║ Other    ║      1 ║ 1/2/2018 ║
║ bottle  ║ Other    ║     11 ║ 1/2/2018 ║
╚═════════╩══════════╩════════╩══════════╝

什么 SQL 查询(在 BigQuery 中)会产生下表?

╔═════════╦══════════╦════════╦══════════╗
║ Keyword ║ Category ║ Amount ║  Update  ║
╠═════════╬══════════╬════════╬══════════╣
║ dog     ║ Animal   ║      2 ║ 1/1/2018 ║
║ fish    ║ Animal   ║      4 ║ 1/1/2018 ║
║ cat     ║ Animal   ║     18 ║ 1/2/2018 ║
║ bird    ║ Animal   ║     13 ║ 1/2/2018 ║
║ rabbit  ║ Animal   ║     11 ║ 1/1/2018 ║
║ lion    ║ Animal   ║      2 ║ 1/2/2018 ║
║ snake   ║ Animal   ║      9 ║ 1/2/2018 ║
║ bike    ║ Other    ║      1 ║ 1/2/2018 ║
║ bottle  ║ Other    ║     11 ║ 1/2/2018 ║
╚═════════╩══════════╩════════╩══════════╝

要求 - 如果在上一个表格中还没有找到,则添加新的关键字 - 如果关键字已经在第一个表中只更新金额和日期

【问题讨论】:

你已经尝试了什么? 【参考方案1】:

这是一种方法:

select t2.*
from t2
union all
select t1.*
from t1
where not exists (select 1 from t2 where t2.keyword = t1.keyword);

这会从第二个表中获取所有内容,并从第一个表中获取不匹配的行。

【讨论】:

【参考方案2】:

表 C 看起来像表 B 加上表 A 中不存在于表 B 中的记录

如果您需要表 C,则将 tablec 创建为 select * from tableb 然后插入到 tablec 中。或者如果您只想要数据,您可以插入到 tableb 中。

INSERT
  INTO tableb
    ( SELECT keyword,category,amount, UPDATE
        FROM tablea
        WHERE NOT EXISTS
          (SELECT 'x' FROM tableb WHERE tableb.keyword = tablea.keyword
          )
    );

【讨论】:

【参考方案3】:

这是我让它工作的方式:

SELECT * FROM dataset.t2
UNION DISTINCT
SELECT * FROM dataset.t1
WHERE t1.Keyword NOT IN (SELECT Keyword FROM `project.dataset.t2`)

【讨论】:

以上是关于在 Bigquery 中连接表,其中仅更新新字符串的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 在重复字段上连接表

使用流式 API 更新新列后无法向 BigQuery 表插入新值

在 bigquery 中更新表

bigquery 自动更新表

谷歌 bigquery - 更新 sql?

BigQuery - 使用更改/删除的记录更新表