UPSERT с SELECT в HANA

#sql #hana #upsert

#sql #hana #upsert

Вопрос:

Я новичок в SQL, и я хочу выполнить UPSERT в таблицу с помощью select из другой таблицы. Например, у меня есть 2 таблицы

 TABLE1
ID   DATE         VALUE
1    23.09.2020   abc
2    01.02.2020   def

TABLE2
ID      VALUE  ADDRESS
1       xyz    mmm
2       zzz    nnn
2       zzz    ppp
3       ccc    qqq
  

Задача состоит в том, чтобы, если идентификатор в TABLE1 имеет значение DATE = ‘23.09.2020’, а идентификатор присутствует в TABLE2, затем обновить столбец ЗНАЧЕНИЙ в TABLE1 ЗНАЧЕНИЕМ в TABLE2. И если идентификатор в TABLE1 присутствует в TABLE2, но не имеет ДАТЫ как ‘23.09.2020’, тогда вставьте distinct (ИДЕНТИФИКАТОР, ЗНАЧЕНИЕ) из TABLE2 в TABLE1. И если идентификатор в TABLE1 отсутствует в TABLE2, тогда ничего не делайте. Таким образом, конечный результат в TABLE1 после UPSERT должен выглядеть следующим образом.

 TABLE1
ID   DATE         VALUE
1    23.09.2020   xyz
2    01.02.2020   def
2    23.09.2020   zzz
  

ПРИМЕЧАНИЕ: столбец ID не является первичным ключом, и я не могу сделать его первичным ключом.
Я пробовал что-то вроде приведенного ниже, но получаю ошибку и не могу достичь желаемого результата.

 upsert TABLE1(ID,DATE,VALUE)
SELECT DISTINCT ID,'23.09.2020',VALUE FROM TABLE2
WHERE TABLE1.ID = TABLE2.ID AND TABLE1.DATE = '23.09.2020'
  

ОБНОВЛЕНИЕ — я попытался использовать СЛИЯНИЕ, как было предложено, но получил ID = 2, вставленный дважды в TABLE1, где, поскольку я хочу, чтобы он вставлялся только один раз как отличный (ID, ЗНАЧЕНИЕ) от TABLE2. Ниже приведен запрос на СЛИЯНИЕ, который я пробовал.

 MERGE INTO TABLE1 T1 
USING TABLE2 T2 ON T1.ID = T2.ID AND T1.DATE = '23.09.2020' 
WHEN MATCHED THEN 
    UPDATE SET T1.VALUE = T2.VALUE 
WHEN NOT MATCHED THEN 
    INSERT(ID,DATE,VALUE) VALUES(T2.ID,'23.09.2020',T2.VALUE);
  

Результат, который я получаю

 TABLE1
ID   DATE         VALUE
1    23.09.2020   xyz
2    01.02.2020   def
2    23.09.2020   zzz
2    23.09.2020   zzz   --> Duplicate, not wanted.
  

Результат, который я хочу

 ID   DATE         VALUE
1    23.09.2020   xyz
2    01.02.2020   def
2    23.09.2020   zzz
  

Как я могу вставить distinct of (ID, VALUE) из TABLE2 с помощью запроса СЛИЯНИЯ?

Комментарии:

1. Я не в hana, но почему бы вам не выбрать merge upsert предпочтительный вариант только тогда, когда доступен первичный ключ?

2. @Sujitmohanty30 Спасибо за предложение. Я попытался использовать слияние, но вставил дубликат. Как я могу получить только отдельный идентификатор, вставленное ЗНАЧЕНИЕ? Я обновил вопрос, который я пробовал.

Ответ №1:

Не могли бы вы попробовать ниже,

Вы почти все сделали правильно, как я вижу, я использовал подзапрос, чтобы выбрать distinct ID , VALUE а затем присоединиться.

 MERGE INTO TABLE1 T1 
USING (SELECT DISTINCT ID,VALUE 
         FROM TABLE2 T2
      ) T2
ON (    T1.ID = T2.ID
    AND T1.DATE = '23.09.2020')
WHEN MATCHED
 THEN 
    UPDATE SET T1.VALUE = T2.VALUE 
WHEN NOT MATCHED
THEN 
    INSERT(ID,DATE,VALUE) 
      VALUES(T2.ID,'23.09.2020',T2.VALUE);
  

Комментарии:

1. Слияние применимо в случае первичного ключа в объединенных данных, поскольку, если у вас есть два значения для одного и того же столбца, не являющегося ключом, тогда DISTINCT не решает проблему. Вы должны реализовать какой-то сложный способ удаления дубликатов. Возможно, данные, которые он хочет вставить, соответствуют этому правилу, но в целом это неверно. Поэтому я не понимаю, как кто-то хочет объединить что-то без первичного ключа в эталонном наборе данных.