Операция слияния Oracle - PullRequest
       11

Операция слияния Oracle

1 голос
/ 14 февраля 2012

Предположим, что следующие две таблицы:

users (username, region, location, department, subdepartment)

и

structure (region, location, department, subdepartment)

При запуске в таблице пользователей каждое имя пользователя отображается в одной записи.Мне бы хотелось, чтобы, если в имени пользователя столбец подотдела был пустым, он автоматически распространялся на все подотделы, определенные для этого отдела в структурной таблице.

Значение, вместо одной записи в таблице пользователей, в конце будет N записей, где N представляет количество подразделений, определенных в структурной таблице для исходного региона, местоположения, комбинации отделов.

Я пытался сделать это с помощью оператора MERGE, но не могу понять.Как я мог это сделать?Спасибо!

Ответы [ 2 ]

2 голосов
/ 14 февраля 2012

На скорости вы можете сделать это:

insert into users
select 
   u.username, u.region, u.location, u.department, s.subdepartment
from users u join structure s 
   on (u.region=s.region and u.location=s.location and u.department = s.department)
where u.subdepartment is null;

delete from users where subdepartment is null;

, но, как указано выше, вы должны быть уверены, что в каждом отделе есть подотделы. (Если это не так, вы должны выполнить несколько простых PL / SQL)

0 голосов
/ 10 мая 2016
create table table01 (
       code int,
       name varchar(50),
       old int
);

create table table02 (
       code int,
       name varchar(50),
       old int
);

insert into table01 values (1, 'A', 10);
insert into table01 values (9, 'B', 12);
insert into table01 values (3, 'C', 14);
insert into table01 values (4, 'D', 16);
insert into table01 values (5, 'E', 18);

insert into table02 values (1, 'AA', null);
insert into table02 values (2, 'BB', 123);
insert into table02 values (3, 'CC', null);
insert into table02 values (4, 'DD', null);
insert into table02 values (5, 'EE', null);

select * from table01 a order by 2;
select * from table02 a order by 2;

merge into table02 a using (
      select b.code, b.old from table01 b
) c on (
  a.code = c.code
)
when matched then update set a.old = c.old
;
...