Как обновить таблицу, объединенную с другой таблицей несколько раз в Oracle? - PullRequest
0 голосов
/ 11 декабря 2018

В моей таблице три поля, и я хочу обновить их, трижды соединяясь с другой таблицей.Я знаю, что должен использовать merge into, но я не смог найти ни одного похожего запроса, который бы использовал merge into и join только с одной таблицей несколько раз.

Оператор select - это нечтокак это:

select * from TABLE t
inner join DESTINATION_TABLE d1
on t.CODE1 = d1.CODE
inner join DESTINATION_TABLE d2
on t.CODE2 = d2.CODE
inner join DESTINATION_TABLE d3
on t.CODE3 = d3.CODE

Теперь, как я могу обновить три поля (FIELD1, FIELD2, FIELD3) из TABLE, используя поля из d1, d2 и d3 с использованием merge into?

РЕДАКТИРОВАНИЕ:

Исходный запрос:

select * from TOTAL
inner join GROUP_LEVEL_DETAIL gl1
on gl1.NAME = substr(GL, 1, instr(GL, ' -', 1))
inner join GROUP_LEVEL_DETAIL gl2
on GL2.NAME = replace(substr(GL, instr(GL, ' -', 1, 1), instr(GL, ' -', 1, 2) - instr(GL, ' -', 1, 1)), ' - ', '')
inner join GROUP_LEVEL_DETAIL gl3
on gl3.NAME = replace(substr(GL, instr(GL, '-', 1, 2), 500), '- ', '')

Пример данных для TOTAL:

  ID                GL                GL1_CODE   GL2_CODE   GL3_CODE
-----  ----------------------------- ---------- ---------- -----------
  1     Sample1 - Sample2 - Sample3    null        null       null
  2     John - Jack - Harry            null        null       null

Пример данных для GROUP_LEVEL_DETAIL:

  CODE         NAME        LEVEL_NO
---------  -----------   ------------
  SMP1       Sample1           1
  SMP2       Sample2           2
  SMP3       Sample3           3
  JCK1       Jack              1
  JHN2       John              2
  HRY3       Harry             3

И я хочу, чтобы моя таблица TOTAL стала такой после обновления:

  ID                GL                GL1_CODE   GL2_CODE   GL3_CODE
-----  ----------------------------- ---------- ---------- -----------
  1     Sample1 - Sample2 - Sample3    SMP1        SMP2       SMP3
  2     John - Jack - Harry            JCK1        JHN2       HRY3

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Когда объединения основаны на первичных ключах или уникальном индексе, вы должны сделать следующее:

--create tables and unix index
create table table1 (code number, field1 number, field2 number, field3 number);
create unique index table1_code_inx on table1 (code);

create table table2 (code number, field1 number, field2 number, field3 number);
create unique index table2_code_inx on table2 (code);

-- update data from table2 to table1
update( select a.FIELD1 A_FIELD1, a.FIELD2 A_FILED2, a.FIELD3 A_FIELD3,
               b.FIELD1 B_FIELD1, b.FIELD2 B_FILED2, b.FIELD3 B_FIELD3 
          from TABLE1 a, TABLE2 b
          where a.CODE = b.CODE )
set A_FIELD1 = B_FIELD1,
    A_FILED2 = B_FILED2,
    A_FIELD3 = B_FIELD3;
0 голосов
/ 11 декабря 2018

Из вашего пересмотренного вопроса я думаю, что решение состоит в том, чтобы собрать имена GROUP_LEVEL_DETAIL в подзапросе, чтобы создать ключ, который можно присоединить к таблице TOTAL.

merge into TOTAL t
using ( select d1.code as d1_code
               , d2.code as d2_code
               , d3.code as d3_code
               , d1.name || ' - ' ||
                 d2.name || ' - ' ||
                 d3.name as joined_code
         from  GROUP_LEVEL_DETAIL d1
         cross join GROUP_LEVEL_DETAIL d2
         cross join GROUP_LEVEL_DETAIL d3
         where d1.level_no = 1
         and   d2.level_no = 2
         and   d3.level_no = 3  
       ) d
on ( t.gl = d.joined_code )
when matched then
    update 
    set t.gl_code1 = d.d1_code
        ,  t.gl_code2 = d.d2_code
        ,  t.gl_code3 = d.d3_code

Подзапрос USING генерирует набор результатов всех возможных перестановок записей из GROUP_LEVEL_DETAIL.После вашей ревизии я включил предложение WHERE для обеспечения выполнения подразумеваемого правила GL = 'level 1 - level 2 - level 3'.Вы можете этого не делать (возможно, не каждая запись в TOTAL имеет действительный GL) или расширять предложение WHERE, чтобы применять любые другие правила, касающиеся допустимых комбинаций.

...