SQL - 有条件地拆分容器行

标签 sql oracle

在迁移容器的过程中,如果我们有两张表;

  1. TABLE_MAPPING (old_value, new_value)
  2. TABLE_USING (value, data...)

TABLE_USING正在引用 (FK) 不相关表中的容器。 TABLE_MAPPING暂时用于迁移,目标是将内容从已弃用的容器移动到新容器。

这里的问题是,有时容器不仅会被替换,还会被分割成多个新容器,例如TABLE_MAPPING可能包含:

<表类=“s-表”> <标题> OLD_VALUE 新值 <正文> 1 10 1 11 2 20

查询将导致将值为“1”的一行“更新”为值为“10”和“11”的两行。

有没有简单的 SQL 方法可以做到这一点?或者我应该使用 PL/SQL?

编辑:根据要求,这里是使用 TABLE_MAPPING 之前/之后的示例上面

之前:

<表类=“s-表”> <标题> 值 IRRELEVANT_COLUMNS ... <正文> 1 ... 2 ...

之后:

<表类=“s-表”> <标题> 值 IRRELEVANT_COLUMNS ... <正文> 10 ... 12 ... 20 ...

最佳答案

您需要两个步骤。下面我首先插入所有新行,然后删除所有旧行。

-- insert rows with new values
insert into table_using (value, data ...)
select m.new_value, u.data ...
from table_using u
join table_mapping m on m.old_value = u.value;

-- delete rows with old values
delete from table_using where value in (select old_value from table_mapping);

-- commit the transaction
commit;

关于SQL - 有条件地拆分容器行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65344112/

相关文章:

java - 创建 Blob 时出现运行时异常

sql - Oracle SQL Operator >= 比 > 具有更高的性能

sql - 从星期一到星期日按星期几排序

sql - 动态 sql 与存储过程 - 优缺点?

MYSQL:如何对每个给定时间段的行数进行分组?

sql - 为什么 Drop Index 需要提交?

linux - 如何在 Linux 中查找 Oracle Forms 编译器的版本

Oracle 插入如果不存在语句

MYSQL:查询未正确考虑最大日期时间列

mysql - 具有不同列值的行的平均时间差