#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 не решает проблему. Вы должны реализовать какой-то сложный способ удаления дубликатов. Возможно, данные, которые он хочет вставить, соответствуют этому правилу, но в целом это неверно. Поэтому я не понимаю, как кто-то хочет объединить что-то без первичного ключа в эталонном наборе данных.