【问题标题】:Doing an upsert in oracle SQL based on 2 fields基于 2 个字段在 oracle SQL 中执行 upsert
【发布时间】:2019-12-30 22:36:32
【问题描述】:

我有以下用于 oracle DB 的 SQL 语句(实际上是这样的语句列表)。

INSERT INTO SCHEMA_ABC.TBL_DATA (username, data_id, version) 
SELECT username, 12345, '1.0' 
FROM SCHEMA_ABC.TBL_USER;

在数据库中,用户名和 ID 的某些组合已经导入。 我想用 upsert 运行这些语句,以便插入所有未丢失的条目(用户名、id、版本),所有其他条目都得到更新(版本)。

有没有不使用PLSQL的方法(开始-异常...)

【问题讨论】:

  • 使用插入not exists

标签: sql oracle upsert


【解决方案1】:

有多种方式:

使用NOT EXISTS

INSERT INTO SCHEMA_ABC.TBL_DATA (username, data_id, version) 
SELECT username, 12345, '1.0' 
FROM SCHEMA_ABC.TBL_USER A
WHERE NOT EXISTS (SELECT 1
FROM SCHEMA_ABC.TBL_DATA NE
WHERE NE.username = A.username
And ne.data_id = 12345);

使用merge: -- 更新

MERGE INTO SCHEMA_ABC.TBL_DATA T
USING (SELECT username, 12345 data_id, '1.0' version
FROM SCHEMA_ABC.TBL_USER) D
ON (T.USERNAME = D.USERNAME 
AND T.DATA_ID = D.DATA_ID)
WHEN MATCHED THEN 
UPDATE SET VERSION = VERSION + 1
WHEN NOT MATCHED THEN
INSERT(username, data_id, version) 
Values
(D.USERNAME, D.DATA_ID, D.VERSION);

干杯!!

【讨论】:

  • 这不起作用 - 因为它只是一个插入,如果不存在 - 但如果版本更改,则没有更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 2020-02-12
相关资源
最近更新 更多