Обновите огромную таблицу значениями из другой таблицы, используя условие множественного подобия - PullRequest
0 голосов
/ 20 июня 2019

У меня есть таблица REVERSE со столбцами как

ID ORG_ID FULL_ID DATE_REV
-- ------ ------- --------
X1 11%    NULL
X2 22%    NULL
X3 33%    NULL
X4 44%    NULL
X5 55%    NULL

У меня есть другая таблица MASTER со столбцами как

FULL_ORG DATE 
-------- --------
11ABC    20190101
22DEF    20190101
33GHI    20190101
44XYZ    20190101
55MNO    20190101

Как я могу найти FULL_ORG и соответствующее значение DATE из MASTER, используя ORG_ID из REVERSE, и обновить соответственно поля FULL_ID и DATE_REV.

Пожалуйста, помогите ..

Результат должен быть таким, как показано ниже.

TXN ORG_TXN FULL_ORG DATE
--- ------- -------- --------
  1 11%     11ABC    20190101
  2 22%     22DEF    20190101
  3 33%     33GHI    20190101
  4 44%     44XYZ    20190101
  5 55%     55MNO    20190101

Ответы [ 3 ]

0 голосов
/ 20 июня 2019

Вы можете использовать следующий запрос для обновления данных в таблице REVERSE:

MERGE INTO REVERSE R 
USING MASTER M 
ON ( REGEXP_SUBSTR(R.ORG_ID, '^\d+') = REGEXP_SUBSTR(M.FULL_ORG, '^\d+') )
WHEN MATCHED THEN 
UPDATE 
SET R.FULL_ID = M.FULL_ORG,
R."DATE" = M."DATE"

Демонстрация DB Fiddle

Cheers !!

0 голосов
/ 20 июня 2019

Если ваш ORG_ID имеет фиксированную длину (например, две цифры и символ %), вы можете просто объединить substr ключ

select r.org_id,
   m.full_org,
   m.c_date
from reverse r join master m 
on  substr(r.org_id,1,2) =  substr(m.full_org,1,2)

Это будет наиболее метод Performan , но не работает, если длина ключа изменяется

0 голосов
/ 20 июня 2019

Вот один вариант, который вы могли бы рассмотреть:

SQL> with
  2  rev (id, org_id) as
  3    (select 'X1', '11%' from dual union all
  4     select 'X2', '22%' from dual union all
  5     select 'X3', '33%' from dual union all
  6     select 'X4', '44%' from dual union all
  7     select 'X5', '55%' from dual
  8    ),
  9  mas (full_org, c_date) as
 10    (select '11ABC', 20190101 from dual union all
 11     select '22DEF', 20190101 from dual union all
 12     select '33GHI', 20190101 from dual union all
 13     select '44XYZ', 20190101 from dual union all
 14     select '55MNO', 20190101 from dual
 15    )
 16  select regexp_substr(r.id, '\d+$') txn,
 17         r.org_id,
 18         m.full_org,
 19         m.c_date
 20  from rev r join mas m on regexp_substr(r.org_id, '^\d+') = regexp_substr(m.full_org, '^\d+');

TXN      ORG FULL_     C_DATE
-------- --- ----- ----------
1        11% 11ABC   20190101
2        22% 22DEF   20190101
3        33% 33GHI   20190101
4        44% 44XYZ   20190101
5        55% 55MNO   20190101

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