2017-08-08 26 views
1

enter image description here私はこの問題に直面していますソース表

内の行の安定したセットを取得することができません、誰かがこのMERGE文を検証するために助けることができますか?

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; 
+1

の代わりに、あなたの質問に直接貼り付けコピーしてくださいあなたのコードのイメージを掲載します。 – litelite

+0

コードやSQLの画像は役に立たない。理由の多くは、[this meta post](https://meta.stackoverflow.com/a/285557/62576)を参照してください。 SQLはプレーンテキストなので、コピー、ペースト、適切な書式設定が可能です。これを行うには[編集]してください。ありがとう。 –

答えて

0

MERGE操作を試行する前に、WC_FNHLDNG_DおよびW_ASSET_Dでロックを取得します。

0

マージのルールは、ターゲットテーブルの行に一致するUSINGサブクエリに複数の行が存在しないことです。与えられたROW_WIDに複数の異なるCONTACT_WIDがあるのであれば、それはROW_WIDために複数の行が返されます

SELECT distinct ROW_WID, CONTACT_WID FROM W_ASSET_D

あなたのサブクエリはこれです。 CONTACT_WIDが異なるため、DISTINCT句は役に立ちません。

あなたの声明ではORA-30926が発砲しているという事実は、これがあなたのデータの状態であることを示しています。 OracleはW_ASSET_D.CONTACT_WIDがWC_FNHLDNG_Dにマージするための正しいものであるかどうかわかりません。 ROW_WIDごとに1つのCONTACT_WIDのみを返すように、USINGサブクエリを書き換えるソリューションです。

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を選択するよりも良いではないです:)

関連する問題