【问题标题】: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

标签: mysql sql apache-spark-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

【讨论】:

猜你喜欢
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 2021-10-19
  • 1970-01-01
  • 2017-03-24
相关资源
最近更新 更多