在 HANA 中使用 SELECT 进行 UPSERT

UPSERT with SELECT in HANA

我是 SQL 的新手,我想用另一个 table 的 select 对 table 进行 UPSERT。例如我有 2 tables

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'

UPDATE - 我尝试按照建议使用 MERGE,但在 TABLE1 中将 ID = 2 插入两次,而我希望它只插入一次,因为与 (ID,VALUE) 不同表 2。下面是我试过的 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)?

你可以试试下面的,

正如我所见,您几乎做对了所有事情,我所做的是使用子查询 select 不同的 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);