обновить нулевой столбец из выбора - PullRequest
0 голосов
/ 28 мая 2020

У меня есть таблица ниже, примерно 3 миллиона строк.

at_id  a.at_type_cd   
  1      red           
  2      blue          
  3      yellow  

Я хочу добавить столбец, поэтому сделал следующее.

alter table ship.alt
add (src_ind char(1) null)

Теперь у меня есть таблица ниже:

at_id    at_type_cd   src_ind
  1      red           (null)
  2      blue          (null)
  3      yellow        (null)

Все значения в src_ind равны нулю. Я хочу добавить значения в src_ind на основе выбора из другой таблицы.

merge into &tableschema..alt dest
using (select /* parallel(a,16) */
    x.at_id,
    x.src_ind
    from (select
          a.at_id,
          case 
          when alt.tracks_t is null 
          then 'H' 
          when alt.tracks_at = 1 
          then 'B'
          else 'x'
          end src_ind
          from &tableschema..alt a
          left join (select 
                     alt.at_type,
                     alt.tracks_at
                     from &tableschema..at_tys@db alt
                     where alt.tracks_at <> 0) alt
                     on a.at_type_cd = alt.at_type
                     where 1=1)x ) src
                     on (src.at_id = dest.at_id) 
when matched then                                
 update set
 dest.src_ind = src.src_ind
when not matched then
insert (src_ind)
values (src.src_ind)  

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

update vs insert vs merge

Может быть insert с где exist?

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Ваша таблица at_tys кажется, находится в другой базе данных, поэтому я бы скопировал ее, предварительно выбрав строки, которые вам понадобятся:

CREATE TABLE local_tys NOLOGGING AS
SELECT at_type, at_tracks_at
  FROM &tableschema..at_tys@db alt
  WHER alt.tracks_at <> 0;

Затем я бы написал SELECT, который присоединяется к вашему старая таблица без столбца и значений нового столбца. Я не совсем понял ваше соединение, поэтому это всего лишь макет:

SELECT a.at_id, a.at_type_cd, b.
  FROM &tableschema..alt a
  JOIN local_tys b 
    ON a.at_type_cd = b.at_type ....

Затем я бы создал таблицу из этого запроса, и как только он будет построен, удалите старую таблицу и переименуйте временную таблицу, создайте индекс et c.

0 голосов
/ 28 мая 2020

Пожалуйста, используйте запрос ниже,

merge into &tableschema..alt dest
using (select 
x.at_id,
x.src_ind
from (select /* parallel(a,16) */
      a.at_id,
      case 
      when alt.tracks_t is null 
      then 'H' 
      when alt.tracks_at = 1 
      then 'B'
      else 'x'
      end src_ind
      from &tableschema..alt a
      left join (select  /* parallel(a,16) */
                 alt.at_type,
                 alt.tracks_at
                 from &tableschema..at_tys@db alt
                 where alt.tracks_at <> 0) alt
                 on a.at_type_cd = alt.at_type
                 where 1=1)x ) src
                 on (src.at_id = dest.at_id) 
when matched then                                
 update set
 dest.src_ind = src.src_ind
 when not matched then
insert (src_ind)
values (src.src_ind) ; 
...