【问题标题】:SQL Update based on secondary table in BQBQ中基于二级表的SQL更新
【发布时间】:2021-09-19 19:26:38
【问题描述】:

我有 2 个表格,1 个包含信息主体,第二个包含有关国家命名约定的信息。在信息表中,国家由名称标识,我想更新此字符串以包含一个 ISO alpha 3 值,该值包含在命名约定表中。例如转向“英国”->“GBR”

我编写了以下查询来进行更新,但它会影响 0 行

UPDATE 
    `db.catagory.test_votes_ds`
SET 
    `db.catagory.test_votes_ds`.country =  `db.catagory.ISO-Alpha`.Alpha_3_code
FROM
    `db.catagory.ISO-Alpha`
WHERE 
    `LOWER(db.catagory.ISO-Alpha`.Country) = LOWER(`db.catagory.test_votes_ds`.country) 

我已经在 2 之间的更新之外进行了内部连接,以确保这些值是兼容的并且它返回正确的值,关于它为什么不更新的任何想法?

下面列出了用于验证结果的连接以及结果:

SELECT 
    `db.catagory.test_votes_ds`.country, `db.catagory.ISO-Alpha`.Alpha_3_code
from 
    `db.catagory.test_votes_ds`
inner join 
    `db.catagory.ISO-Alpha` 
on 
    LOWER(`db.catagory.test_votes_ds`.country) = LOWER(`db.catagory.ISO-Alpha`.Country)
1,Ireland,IRL
2,Australia,AUS
3,United States,USA
4,United Kingdom,GBR

【问题讨论】:

  • 。 .该代码应该可以工作。编辑您的问题并显示您用于验证匹配的 SELECT 查询。
  • 我已经用连接查询更新了它^^
  • 。 .在update 中也使用lower()
  • 我不知道为什么我错过了原始代码,但当前代码在该行中使用了 Lower 并且仍然没有返回任何内容,我再次更新了帖子以反映这一点。

标签: sql google-bigquery dml


【解决方案1】:

这并不完全是一个答案。但是您的测试可能还不够。您需要检查值不匹配的位置。所以,要返回那些:

select tv.*
from `db.catagory.test_votes_ds` tv left join
     `db.catagory.ISO-Alpha` a
     on LOWER(tv.country) = LOWER(a.Country)
where a.Country IS NULL;

我怀疑您会发现不匹配的国家/地区。因此,当您运行更新时,匹配项会在第一次更改。那么不匹配的就永远不会改变了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多