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中的TABLE1中存在ID,但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,但是在表1中两次插入了ID = 2,而我希望它仅以与表2不同的(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,VALUE) VALUES(T2.ID,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)?

解决方法

您可以在下面尝试

正如我所见,您几乎完成了所有操作,我使用子查询选择了不同的IDVALUE然后加入。

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);