How to use delete while using merge to update and insert query in oracle?

iezvtpos  于 2022-11-03  发布在  Oracle
关注(0)|答案(1)|浏览(207)

我正在使用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>
ws51t4hk

ws51t4hk1#

“Delete not working”(删除不工作)意味着,我认为,没有行被删除。
乍一看,您发布的代码看起来不错。无法测试,我们没有您的表或数据。
但是,您是否仔细阅读了文档中的说明?
指定DELETE where_子句以在填充或更新表时清除表中的数据。受此子句影响的唯一行是目标表中由合并操作更新的那些行。DELETE WHERE条件计算更新的值,而不是UPDATE SET... WHERE条件计算的原始值。如果目标表的某行满足DELETE条件但不包含在ON子句定义的连接中,则不删除它。对于每次行删除,将激活在目标表上定义的任何删除触发器。
这是ON子句:

ON (iap.id='AccessDataStaging' AND 
    iap.R_TYPE ='App1' AND 
    iap.OBJECT ='Obj' AND 
    iap.S_type ='User' AND 
    iap.PERSON ='Application New')              --> [A]

这是DELETE WHERE子句:

DELETE WHERE iap.PERSON='Application New' AND   --> [A]
             iap. Permissions != 'K'            --> [B]

[A]两个子句中的condition匹配,但是-ON子句中的[B] condition不匹配,所以我猜这就是行未被删除的原因。

相关问题