sql - 根据条件创建新行 - Oracle SQL
问题描述
我有一张桌子
ID ID2 VARIABLE VA_VAL
1 100 F_NAME ABC
1 102 QUAL 01
1 103 CODE 1923
2 100 F_NAME BCD
2 102 QUAL 02
2 103 CODE 2034
3 100 F_NAME CDE
3 102 QUAL 01
3 103 CODE 5436
如果 ID2 = 102 且 VARIABLE = QUAL 且 VA_VAL = 01,则插入 ID2 = 104,VARIABLE = NEW_CD1 和 VA_VAL = (VA_VAL of (ID2 = 103 and VARIABLE = CODE) )
此外,删除相同 ID 的行(ID2 = 102 和 VARIABLE = QUAL 和 VA_VAL = 02)和(ID2 = 103 和 VARIABLE = CODE)。
如果 ID2 = 102 且 VARIABLE = QUAL 且 VA_VAL = 02,则插入 ID2 = 103,VARIABLE = NEW_CD2 和 VA_VAL = (VA_VAL of (ID2 = 103 and VARIABLE = CODE) )
此外,删除相同 ID 的行(ID2 = 102 和 VARIABLE = QUAL 和 VA_VAL = 02)和(ID2 = 103 和 VARIABLE = CODE)。
输出表如下:
ID ID2 VARIABLE VA_VAL
1 100 F_NAME ABC
1 104 NEW_CD1 1923
2 100 F_NAME BCD
2 105 NEW_CD2 2034
3 100 F_NAME CDE
3 104 NEW_CD1 5436
有没有办法在 Oracle SQL 中高效地做到这一点?我的表中有超过 5000 万条记录。
解决方案
我假设您只想要一个结果集。这是想法:
- 选择您想要的现有行。
- 添加每个变量作为单独的子查询。
结果查询如下所示:
select ID, ID2, VARIABLE, VA_VAL
from t
where not ((ID2 = 102 and VARIABLE = 'QUAL' and VA_VAL = '02') or
(ID2 = 103 and VARIABLE = 'CODE')
)
union all
select t.id, 104 as id2, 'NEW_CD1',
max(case when ID2 = 103 and VARIABLE = 'CODE' then VA_VAL end)
from t
group by t.id
having max(case when ID2 = 103 and VARIABLE = 'CODE' then VA_VAL end) is not null
union all
select t.id, 104 as id2, 'NEW_CD1',
max(case when ID2 = 102 and VARIABLE = 'QUAL' then VA_VAL end
from t
group by t.id
having max(case when ID2 = 102 and VARIABLE = 'QUAL' then VA_VAL end) is not null;
如果你想替换你现有的表——并且有很多变化(我假设这是真的)——运行这个查询并将结果保存在一个表中。
然后,截断现有表并将值重新插入其中。
推荐阅读
- sql-server - 如何更改 rdlc 报告上的 tablix 以节省空间?
- python - 通过将单词与英语单词白名单进行比较来检查单词是否为英语的快速(er)方法?
- java - 运行 Testcase Corda enterprise 3.1 时找不到类
- ios - 约束未能添加填充
- javascript - NodeORM 按日期月份分组
- wordpress - 如何修复 Godaddy 中的 508 资源限制。进入过程显示最大超过
- clojure - 有条件地绑定来自 Clojure 核心的动态 var 以实现向后兼容性
- excel - 如果出现错误,则出现“下一步”问题“错误”结束 VBA
- angular - Angular 6验证数字输入
- azure - 无法使用 NotificationHub + ApnsCredentials 部署 arm 模板