Какой самый эффективный способ обновить значения таблицы на основе сопоставления из другой таблицы - PullRequest
0 голосов
/ 23 мая 2018

У меня есть таблица, включающая следующие детали.

empID   department  location    segment 
1   23  55  12
2   23  11  12
3   25  11  39

У меня также есть таблица сопоставления, подобная следующей

Field   old value   new value
Department  23  74
department  25  75
segment   10    24
location    11  22  

Поэтому моя задача - заменить старые значения новыми.На самом деле я могу использовать курсор и обновлять отделы, а затем сегменты и так далее.Но это отнимает много времени и неэффективно.Я хотел бы знать, есть ли эффективный способ сделать это.Что также необходимо поддерживать в будущем, если мы планируем добавить больше столбцов в отображение.

cheers.

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Как насчет копирования данных в новую таблицу?

CREATE TABLE newemp AS
SELECT e.empid,
       NVL(d.new_value, e.department) AS department,
       NVL(l.new_value, e.location)   AS location,
       NVL(s.new_value, e.segment)    AS segment
  FROM emp e
  LEFT JOIN map d ON d.field='DEPARTMENT' AND e.department = d.old_value
  LEFT JOIN map l ON l.field='LOCATION'   AND e.location   = d.old_value
  LEFT JOIN map s ON s.field='SEGMENT'    AND e.segment    = d.old_value
 ORDER BY e.empid;

EMPID   DEPARTMENT  LOCATION    SEGMENT
1   84  55  12 
2   84  11  12
3   75  11  39

Очевидно, вам понадобится три прохода через таблицу сопоставления, но только один проход через таблицу emp.

Мы используем LEFT JOIN, потому что не все значения будут изменены.Если новое_значение не найдено, функция NVL использует существующее значение таблицы emp.

Вы можете обновить исходную таблицу из этой новой таблицы (если новая таблица имеет первичный ключ):

UPDATE (SELECT empid,
               e.department as old_department, 
               n.department as new_department, 
               e.location   as old_location,
               n.location   as new_location,
               e.segment    as old_segment,
               n.segment    as new_segment
          FROM emp  e
          JOIN newemp n USING (empid))
  SET old_department = new_department,
      old_location   = new_location,
      old_segment    = new_segment
WHERE old_department != new_department
   OR old_location   != new_location
   OR old_segment    != new_segment;
0 голосов
/ 23 мая 2018

Отметьте это, если это решает проблему.

update emp set department = (select map.new_value from map where emp.department = map.old_value);
...