在单个查询中根据表数据插入或更新

问题描述 投票:0回答:1

我有2张桌子:

表1:

EnrollmentTransaction

EnrollmentId | TransactionId
-------------+--------------
5            | 1
5            | 2
6            | 3
7            | 2
8            | 3
8            | 2
8            | 1

表2:

EnrollmentDetail
TransactionId
新添加的列,默认值为1,因为它不是空列)

EnrollmentId | ParameterId| TransactionId 
-------------+------------+---------------
5            | 1          | 1
6            | 8          | 1
7            | 9          | 1
7            | 6          | 1
8            | 8          | 1

参考表1,如果没有条目我想插入,如果有条目则更新基于

EnrollmentId

例如:

场景 1

EnrollmentId = 5
表 1 中有 2 个条目,而表 2 只有 1 个条目,我必须在表 2 中再插入一行值为 5、1、2 的行。

场景 2

EnrollmentId = 6
表 1 中只有 1 个条目,我需要更新表 2 中的值 6、8、3。

是否有可能编写单个查询来实现此目的?

注:Oracle 19 是数据库。

sql database oracle plsql
1个回答
0
投票

使用

MERGE
语句组合
INSERT
UPDATE

MERGE INTO EnrollmentDetail d
USING EnrollmentTransaction t
ON (d.enrollmentid = t.enrollmentid AND d.transactionid = t.transactionid)
WHEN NOT MATCHED THEN
  INSERT (EnrollmentId, ParameterId, TransactionId)
  VALUES (t.enrollmentid, NULL, t.transactionid)
WHEN MATCHED THEN
  UPDATE
  SET d.parameterid = d.parameterid -- or whatever you want to update it to.

注意:您似乎不需要

WHEN MATCHED THEN UPDATE ...
子句,因为问题中没有描述任何
UPDATE
应该做什么的逻辑;但是,为了完整性,我将其包含在答案中,但它将行设置为相同的值,因此可以(应该)将其删除。

对于样本数据:

CREATE TABLE EnrollmentTransaction (EnrollmentId, TransactionId) AS
SELECT 5, 1 FROM DUAL UNION ALL
SELECT 5, 2 FROM DUAL UNION ALL
SELECT 6, 3 FROM DUAL UNION ALL
SELECT 7, 2 FROM DUAL UNION ALL
SELECT 8, 3 FROM DUAL UNION ALL
SELECT 8, 2 FROM DUAL UNION ALL
SELECT 8, 1 FROM DUAL;

CREATE TABLE EnrollmentDetail (EnrollmentId, ParameterId, TransactionId) AS
SELECT 5, 1, 1 FROM DUAL UNION ALL
SELECT 6, 8, 1 FROM DUAL UNION ALL
SELECT 7, 9, 1 FROM DUAL UNION ALL
SELECT 7, 6, 1 FROM DUAL UNION ALL
SELECT 8, 8, 1 FROM DUAL;

然后,在

MERGE
之后,表格包含:

注册ID 参数ID 交易ID
5 1 1
6 8 1
7 9 1
7 6 1
8 8 1
7 2
8 3
5 2
6 3
8 2

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.