无法在源表中获得稳定的行集

时间:2017-08-08 02:04:41

标签: sql oracle sql-merge

enter image description here

我正面临这个问题,有人可以帮助验证这个合并声明吗?

MERGE INTO WC_FNHLDNG_D T1 
USING (SELECT distinct ROW_WID, CONTACT_WID
        FROM W_ASSET_D 
         WHERE X_TYPE_CD='Fin Account')T2 
ON (T1.ASSET_WID=T2.ROW_WID) 
WHEN MATCHED THEN UPDATE 
SET T1.CONTACT_WID=T2.CONTACT_WID;

2 个答案:

答案 0 :(得分:0)

在尝试MERGE操作之前,获取WC_FNHLDNG_D和W_ASSET_D上的锁。

答案 1 :(得分:0)

合并规则是USING子查询中必须只有一行与目标表中的行匹配。

您的子查询是这样的:

  

SELECT distinct ROW_WID, CONTACT_WID FROM W_ASSET_D

因此,如果给定的ROW_WID存在多个不同的CONTACT_WID,则它将为ROW_WID返回多行。 DISTINCT条款没有帮助,因为CONTACT_WID是不同的。

您的声明发出ORA-30926这一事实表明这是您的数据状态。 Oracle不知道哪个W_ASSET_D.CONTACT_WID是合并到WC_FNHLDNG_D的正确的,所以它放弃了。重写USING子查询的解决方案,因此每个ROW_WID只返回一个CONTACT_WID。

您应该在WHERE子句中添加一些其他业务规则。但作为最后的手段,您可以使用聚合功能,例如

USING (SELECT ROW_WID, max( CONTACT_WID) as CONTACT_WID
       FROM W_ASSET_D 
       WHERE X_TYPE_CD='Fin Account'
       group by ROW_WID
   )T2 

这比选择一个随机的CONTACT_WID更好但不是很多:)