根据其他表中的值更新表列

Posted

技术标签:

【中文标题】根据其他表中的值更新表列【英文标题】:Update table columns based on values in other table 【发布时间】:2021-10-27 15:06:31 【问题描述】:

我有两张桌子

                 showroom
============================================
model_id    car_name         is_available
--------------------------------------------
   0        rav4              false
   1        tacoma            false
   2        corolla           false
   3        tundra            false

      warehouse
========================
model_id    car_name         
------------------------
   0        rav4              
   1        tacoma   

主键是model_id。如果model_id 存在于warehouse 中,我想将showroom.is_available 列更新为true。因此,根据上述示例的输出将是

                  showroom
    ============================================
    model_id    car_name         is_available
    --------------------------------------------
       0        rav4              true
       1        tacoma            true
       2        corolla           false
       3        tundra            false

我知道我能做到

UPDATE showroom
SET is_available = true
WHERE model_id IN (
SELECT model_id
FROM warehouse
);

但两个表都有超过十亿行,即使我使用的是 Spark SQL,查询也很慢

【问题讨论】:

你的 rdbms 是什么? @BryanDellinger 这些是数据块上的增量表。我正在使用火花 sql 【参考方案1】:
SELECT
  a.model_id
  ,a.car_name
  ,CASE WHEN b.model_id IS NOT NULL THEN TRUE ELSE FALSE END is_available
FROM
  showroom a
  LEFT OUTER JOIN warehouse b ON (a.model_id = b.model_id)

【讨论】:

OP 为什么要试试这个好的答案将始终解释所做的工作以及这样做的原因,不仅适用于 OP,而且适用于 SO 的未来访问者,他们可能会发现这个问题并正在阅读您的答案。如果回答得很好,也许他们会支持它。【参考方案2】:

在大表上,连接比 IN 子句快

看看能不能#减少数量

对于陈列室,您可以在 (model_id,is_available) 上使用组合索引

当你能够减少可能的候选人数量时

UPDATE showroom s
INNER JOIN warehouse w ON s.model_id = w.model_id
SET s.is_available = true
WHERE s.is_available = FALSE

【讨论】:

你使用的是什么 CV h mysql 版本? 你应该使用合并docs.delta.io/0.4.0/delta-update.html

以上是关于根据其他表中的值更新表列的主要内容,如果未能解决你的问题,请参考以下文章

根据表中其他列的值从同一表中的 2 列中选择信息

根据其他列中的条件更新一列中的值

我如何使用条件从其他表中更新表中的数据

如何从 SQL Server 读取 MS Access 数据库以更新一个或多个表列中的数据?

根据另一列中的值更新 BigQuery 中的嵌套数组

根据其他列选择列中的值