sql - 如何根据第 1 列更新第 2 列,然后根据第 2 列更新第 3 列
问题描述
我正在处理一个现有表,其中第 2 列和第 3 列中的数据缺失或不正确,因此我需要根据第 1 列更新这些列,然后在更新后第 2 列。
第 1 列是车辆“类别”(大型车、小型 suv 2wd、皮卡 4wd 等)。第 2 列应该是基于第 1 列中车辆类别的“type_id”(编号 1-6)。然后第 3 列是基于第 2 列中类型 id 的车辆“类型”(轿车、皮卡等)。
为了更新第二列“type_id”,我尝试了以下几种变体:
UPDATE mytable
SET type_id = CASE
WHEN "class" = 'Compact Cars' then '1' ELSE type_id
WHEN "class" = 'Midsize Station Wagons' then '3' ELSE type_id
WHEN "class" = 'Minivan - 2WD' then '2' ELSE type_id
WHEN "class" = 'Minivan - 4WD' then '2' ELSE type_id
等等。
第 1 列中大约有 30 个不同的变量需要与第 2 列中的 ID 号相对应。从那里我需要使用与第 2 列中的数字相对应的基本车辆类型更新第 3 列。
任何帮助表示赞赏。
解决方案
我真的不明白这里迭代逻辑的意义:正如我理解你的问题,你可以将一个类型 id 和一个类型关联到每个类。
表值在这里可能会派上用场:
update mytable t
set type_id = x.type_id, type = x.type
from (
values
('Compact Cars', 1, 'sedan'),
('Midsize Station Wagons', 3, 'foo'),
('Minivan - 2WD', 2, 'pickup'),
('Minivan - 4WD', 2, 'pickup'),
) x(class, type_id, type)
where x.class = t.class
如果您要执行大量转码,将它们全部存储在一个表中会更简单,您可以直接加入您的查询。
推荐阅读
- java - 并行流 Java 8 的 CPU 内核数
- c# - net 2 上的 C# 多线程,firebird 数据库取消并重新启动,如何?
- php - Elasticsearch“你的意思是”功能
- android - ffmpeg 命令创建可共享到 Instagram 等的 mp4 视频
- java - 使用 apache Shiro 会话到期时如何重新登录?
- json - 将命令的输出转换为有效的 json?
- reactjs - Formik 和反应自动完成
- php - 我想在关联数组中搜索字符串
- github - GitHub 上的搜索结果数量从搜索到搜索发生巨大变化
- pandas - 如何从 DataFrame 中选择一列,使其具有 (n, 1) 而不是 (n,) 的形状?