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