在 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 不同的 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);
我是 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 不同的 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);