Создать новые строки на основе условия - Oracle SQL - PullRequest
0 голосов
/ 04 мая 2019

у меня есть стол

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 из (ID2 = 103 и VARIABLE = CODE))

    Кроме того, удалите строки (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 из (ID2 = 103 и VARIABLE = CODE))

    Кроме того, удалите строки (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, который эффективен? У меня в таблице более 50 миллионов записей.

1 Ответ

1 голос
/ 04 мая 2019

Полагаю, вы просто хотите получить набор результатов. Вот идея:

  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;

Если вы хотите заменить существующую таблицу - и есть много изменений (которые я предполагаю, что это правда) - запустите этот запрос и сохраните результаты в таблице.

Затем обрежьте существующую таблицу и заново вставьте в нее значения.

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