我有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 是数据库。
使用
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 |