sql - 在 HANA 中使用 SELECT 进行 UPSERT
问题描述
我是 SQL 新手,我想对一个表执行 UPSERT,并从另一个表中选择。例如我有 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 中的 ID 为 DATE = '23.09.2020' 并且 ID 存在于 TABLE2 中,则使用 TABLE2 中的 VALUE 更新 TABLE1 中的 VALUE 列。如果 TABLE1 中的 ID 存在于 TABLE2 中,但 DATE 不为“23.09.2020”,则将来自 TABLE2 的不同 (ID,VALUE) 插入 TABLE1。如果 TABLE1 中的 ID 在 TABLE2 中不存在,则什么也不做。所以 UPSERT 后 TABLE1 中的最终结果应该是这样的。
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'
更新- 我尝试按照建议使用 MERGE,但是在 TABLE1 中插入了两次 ID = 2,因为我希望它只插入一次,因为它与 TABLE2 不同(ID,VALUE)。下面是我尝试的 MERGE 查询。
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
如何使用 MERGE 查询从 TABLE2 中插入不同的 (ID,VALUE) ?
解决方案
你可以试试下面,
正如我所看到的,您几乎已经完成了所有工作,我所做的是使用子查询来选择不同的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);
推荐阅读
- algorithm - 如果我的目的地无法到达,如何到达最近的可到达点?
- shell - “管道标准错误,而不是标准输出”在 Zsh 中不起作用
- javascript - 尝试使用 {object}.#text location 从 JavaScript .json 对象访问数据
- sql-server - 函数中包含的最后一条语句必须是 return 语句
- c# - WPF - 字体真棒图标未在运行时显示
- python - python:使用etree保留xml格式
- python - AttributeError:“str”对象没有属性“errno”
- html - 使文本和复选框并排
- regex - 正则表达式检查字符串是否至少有 2 个数字和 1 个大写字母
- python - Keras model.load_weights() error: ValueError: Invalid high library version bound (invalid high library version bound)