【问题标题】:Create new rows based on condition - Oracle SQL根据条件创建新行 - Oracle SQL
【发布时间】:2019-05-04 15:39:55
【问题描述】:

我有一张桌子

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 and 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 and 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 万条记录。

【问题讨论】:

  • AFAIK 不可能在单个语句中执行插入和删除操作。因此,您可能需要多个语句来执行此操作。
  • 我就是这么想的。也许合并查询,例如 - stackoverflow.com/a/55965864/893394。但我不知道考虑到数据的大小它的效率如何。

标签: sql oracle


【解决方案1】:

我假设您只想要一个结果集。思路如下:

  1. 选择您想要的现有行。
  2. 将每个变量添加为单独的子查询。

生成的查询如下所示:

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;

如果您想替换现有的表 - 并且有很多更改(我假设这是真的) - 运行此查询并将结果保存在表中。

然后,截断现有表并将值重新插入其中。

【讨论】:

    猜你喜欢
    • 2021-07-22
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 2021-06-18
    • 2020-09-12
    相关资源
    最近更新 更多