Вставить новые строки на основе условий - Oracle SQL - PullRequest
0 голосов
/ 30 мая 2019

У меня есть таблица:

table1

unique_id       col_id      col_nm      col_val     sequ 
1               1           testq 1     100         1   
1               2           testc 1     abc         1   
1               1           testq 1     101         2   
1               2           testc 1     xyz         2
1               5           test 5      10          1       
1               8           test 6      100         1   


2               1           testq 1     100         1   
2               2           testc 1     pqr         1   
2               1           testq 1     101         2   
2               2           testc 1     xxy         2
2               5           test 5      qqw         1       
2               8           test 6      100         1   

Мне нужно вставить новые строки в таблицу на основании следующего условия:

  1. Найти unique_id и sequ из col_id = 1 и col_nm = 'testq 1' и col_val = 100
  2. Найдите col_val из col_id = 2 и col_nm = 'testc 1' и sequ = {sequ из шага 1} и unique_id = {unique_id из шага 1}.
  3. Вставьте новую строку для соответствующего unique_id, с col_id = 100, col_nm = 'test q100c', col_val = {col_val найден в шаге 2}, sequ = {sequ найден в шаге 2}

Вывод будет:

unique_id       col_id      col_nm      col_val     sequ 
1               1           testq 1     100         1   
1               2           testc 1     abc         1   
1               1           testq 1     101         2   
1               2           testc 1     xyz         2
1               5           test 5      10          1       
1               8           test 6      100         1   
1               100         test q100c  abc         1

2               1           testq 1     100         2   
2               2           testc 1     pqr         2   
2               1           testq 1     101         2   
2               2           testc 1     xxy         2
2               5           test 5      qqw         1       
2               8           test 6      100         1   
2               100         test q100c  pqr         2

Есть ли в SQL что-нибудь для достижения этой цели?

1 Ответ

2 голосов
/ 30 мая 2019

Мы можем использовать предложение WITH в конструкции INSERT… SELECT.Так что-то вроде этого?

insert into table1
with s1 as (
  select t.unique_id 
         , t.sequ 
  from table1 t
  where t.col_id = 1 
  and t.col_nm = 'testq 1' 
  and t.col_val = 100 )
  , s2 as (
     select s1.*
            , t.col_val
      from s1
           join table1 t 
              on t.sequ = s1.sequ
              and t.unique_id = s1.unique_id
  where t.col_id = 2
  and t.col_nm = 'testc 1' 
)
select s2.unique_id
       ,100 as col_id 
       ,'test q100c' as col_nm
       ,s2.col_val
       ,s2.sequ 
from s2
/

Я не уверен, что полностью понял ваши правила - я использовал col_val из шага # 2 (что показывает ожидаемый результат), а не значение изШаг № 1, как говорится в вашем правиле 3 - но я надеюсь, что это даст вам старт.Кроме того, это может быть не очень эффективным подходом.Я не даю никаких гарантий относительно производительности большого объема данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...