我正在使用PostgreSQL和oracle进行同一查询。使用PostgreSQL更新时,剩余条目将被删除,匹配的条目将被更新。在oracle中使用合并的同一查询不会删除未更新的条目。
Postgres查询:
<pre><code>
`INSERT INTO IAG_PERMISSION(id,bid,aid,s_type,subject,r_type,object,permissions,tid,person)
VALUES(?,?,?,?,?,?,?,?,?,?)
ON CONFLICT ON CONSTRAINT IAG_PERM_UK1
DO
UPDATE SET SUBJECT=?,PERMISSIONS=?`
</code></pre>
Oracle查询:
<pre><code>
`MERGE INTO IAG_PERMISSION iap
USING dual
ON (iap.AID = ?
AND iap.R_TYPE = ?
AND iap.OBJECT = ?
AND iap.R_TYPE = ?
AND iap.PERSON = ? )
WHEN MATCHED THEN UPDATE SET SUBJECT = ? , PERMISSIONS = ?
WHEN NOT MATCHED THEN INSERT (iap.id,iap.bid,iap.aid,iap.s_type,iap.subject,iap.r_type,iap.object,iap.permissions,iap.tid,iap.person)
VALUES (?,?,?,?,?,?,?,?,?,?`);
`
</code></pre>
这是两个查询,我希望oracle查询与postgres一样工作,并且在匹配时删除而不是更新查询,我尝试使用delete语句,但它不起作用。Oracle文档说明使用delete where子句清理数据,但在我的情况下不起作用。我不明白我做错了什么。
使用合并执行插入和更新时,删除不起作用。提前感谢您。
我尝试的查询:
<pre><code>
`MERGE INTO IAG_PERMISSION IAP
USING dual d
ON (iap.id='AccessDataStaging' AND iap.R_TYPE ='App1' AND iap.OBJECT ='Obj' AND iap.S_type ='User'
AND iap.PERSON ='Application New')
WHEN NOT MATCHED THEN INSERT(iap.id,iap.bid,iap.aid,iap.s_type,iap.subject,iap.r_type,iap.object,iap.permissions,iap.tid,iap.person)
VALUES ('of2167aa-769e-4621-b7ff-61b2f44741ea',64, 'AccessDataStaging','User','Sakshi','App1','Obj','N',64,'Application New')
WHEN MATCHED THEN UPDATE SET iap. Subject = 'Sakshi', iap. PERMISSIONS ='K'
DELETE WHERE iap.PERSON='Application New' AND iap. Permissions != 'K';
`
</code></pre>
1条答案
按热度按时间ws51t4hk1#
“Delete not working”(删除不工作)意味着,我认为,没有行被删除。
乍一看,您发布的代码看起来不错。无法测试,我们没有您的表或数据。
但是,您是否仔细阅读了文档中的说明?
指定DELETE where_子句以在填充或更新表时清除表中的数据。受此子句影响的唯一行是目标表中由合并操作更新的那些行。DELETE WHERE条件计算更新的值,而不是UPDATE SET... WHERE条件计算的原始值。如果目标表的某行满足DELETE条件但不包含在ON子句定义的连接中,则不删除它。对于每次行删除,将激活在目标表上定义的任何删除触发器。
这是
ON
子句:这是
DELETE WHERE
子句:[A]两个子句中的condition匹配,但是-
ON
子句中的[B] condition不匹配,所以我猜这就是行未被删除的原因。