Улей - Обновить записи в таблице с сегодняшней датой, ЕСЛИ они не найдены в другой таблице? - PullRequest
1 голос
/ 13 марта 2019

В настоящее время у меня есть главная таблица результатов (test1), в которой хранятся все мои записи о проблемах, и вторая таблица (test2), которая запускается каждую неделю или около того, и я пытаюсь найти те записи, которых нет в еженедельнике.обновите, а затем обновите дату в основной таблице результатов, как это было в тот момент, когда она была обновлена ​​в системе для исправления.

Я пытаюсь добавить записи из таблицы test2 в таблицу test1, если ониеще нет в таблице.

Это работает:

insert into table test1 (id, name, code)
select * from test2 t2 where t2.id not in (select id from test1);

Я также пытаюсь обновить столбец таблицы test1 'Corrected_date', чтобы отобразить current_date для всех записей, найденных вtest1 но не в test2

Пример данных ниже:

Таблица 1

ID    NAME    CODE    CORRECTED_DATE
1     TEST    3    
29    TEST2   90 

Таблица 2

ID    NAME    CODE  
12    TEST5   20
1     TEST    3

Ожидаемый конечный результаттаблицы 1

ID    NAME    CODE    CORRECTED_DATE
1     TEST    3       
29    TEST2   90       3/13/2019
12    TEST5   20

1 Ответ

0 голосов
/ 14 марта 2019

Перезаписать таблицу, используя FULL JOIN.FULL JOIN возвращает объединенные записи + не объединенные из левой таблицы + не объединенные из правой таблицы.Вы можете использовать операторы case для реализации вашей логики следующим образом:

insert OVERWRITE table test1

select 
      --select t1 if both or t1 only exist, t2 if only t2 exists
      case when t1.ID is null then t2.ID   else t1.ID   end as ID,
      case when t1.ID is null then t2.NAME else t1.NAME end as NAME,
      case when t1.ID is null then t2.CODE else t1.CODE end as CODE,

      --if found in t1 but not in t2 then current_date else leave as is
      case when (t1.ID is not null) and (t2.ID is null) then current_date else t1.CORRECTED_DATE end as CORRECTED_DATE 
  from test1 t1 
       FULL OUTER JOIN test2 t2 on t1.ID=t2.ID;

См. Также этот похожий вопрос об инкрементных обновлениях, ваша логика отличается, но подход тот же: https://stackoverflow.com/a/37744071/2700344

Тестированиес вашими данными:

with test1 as (
select stack (2,
1, 'TEST',    3,null,    
29,'TEST2',   90 , null
             ) as (ID,NAME,CODE,CORRECTED_DATE)
),

     test2 as (
select stack (2,
              12,'TEST5',20,
              1,'TEST',3
             ) as (ID, NAME, CODE)
)

select 
      --select t1 if both or t1 only exist, t2 if only t2 exists
      case when t1.ID is null then t2.ID   else t1.ID   end as ID,
      case when t1.ID is null then t2.NAME else t1.NAME end as NAME,
      case when t1.ID is null then t2.CODE else t1.CODE end as CODE,

      --if found in test1 but not in test2 then current_date else leave as is
      case when (t1.ID is not null) and (t2.ID is null) then current_date else t1.CORRECTED_DATE end as CORRECTED_DATE 
  from test1 t1 
       FULL OUTER JOIN test2 t2 on t1.ID=t2.ID;

Результат:

OK
id      name    code    corrected_date
1       TEST    3       NULL
12      TEST5   20      NULL
29      TEST2   90      2019-03-14
Time taken: 41.727 seconds, Fetched: 3 row(s)

Результат, как и ожидалось.

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