我正面临这个问题,有人可以帮助验证这个合并声明吗?
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;
答案 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更好但不是很多:)