首页 > 解决方案 > 在 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) ?

标签: sqlhanaupsert

解决方案


你可以试试下面,

正如我所看到的,您几乎已经完成了所有工作,我所做的是使用子查询来选择不同的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);

推荐阅读