2016-07-15 13 views
3

をマッチングに基づく私は私が得る、MASTER_CUSTOMERMCUST_CODEDIM_TRADING_ACCOUNTSTRADING_CODEに等しくないとにかかわらず、私がしようとするものMASTER_CUSTOMERGPIDフィールドに基づいてテーブルDIM_TRADING_ACCOUNTSGPIDフィールドを更新しようとしています基本的には毎回構文エラーになります。OracleのSQL更新表ID

私はthis questionからガイダンスを取っています。私がこれまでに作った4つの試みは、誤りとともに以下にあります。誰かが私が働くOracle SQLの適切な構文を手伝ってくれますか?

注:trading_codeフィールドはすべて大文字であるので、私はmcust_codeにアッパーに使用

試み1(エラーは次のとおりです。SQLコマンドが正常に終了しない)

UPDATE dim_trading_accounts dta 
    SET dta.gpid = mc.gpid 
FROM master_customer mc 
WHERE UPPER(mc.mcust_code) = dta.trading_code; 

試行2(エラー:「SET」キーワードがありません)

UPDATE 
    dim_trading_accounts dta, master_customer mc 
SET 
    dta.gpid = mc.gpid 
WHERE 
    upper(mc.mcust_code) = dta.trading_code; 

試み3(この1つはエラーを返し:単一行のサブクエリは、一行以上を返す)

UPDATE dim_trading_accounts dta 
SET dta.gpid = (SELECT mc.gpid 
       FROM master_customer mc 
       WHERE dta.trading_code = upper(mc.mcust_code)) 
WHERE EXISTS (SELECT 1 
       FROM master_customer mc 
       WHERE dta.trading_code = upper(mc.mcust_code)); 

試み4(エラーがある:欠落キーワード "ON")

MERGE INTO dim_trading_accounts 
    USING master_customer 
    ON dim_trading_accounts.trading_code = upper(master_customer.mcust_code) 
WHEN MATCHED THEN 
    UPDATE 
    SET dim_trading_accounts.gpid = master_customer.gpid; 

答えて

2

maxまたはminのサブクエリを使用して、single-row subquery returns more than one rowエラーを回避します。

UPDATE 
    dim_trading_accounts dta 
SET 
    dta.gpid = (SELECT MAX(gpid) 
       FROM master_customer 
       WHERE upper(mcust_code) = dta.trading_code); 

エラーが起動する理由を、参照selectを使用してgpidtradingcode組み合わせの結果を確認するには。

SELECT mc.gpid, dta.trading_code 
FROM master_customer mc 
JOIN dim_trading_accounts dta ON upper(mc.mcust_code) = dta.trading_code 

あなたは上記のselectから重複行が表示された場合、あなたはupdatemaxまたはminを使用することを確認することができます。

+0

はい、私はこれを発見し、面白い事があります私はまだエラーが発生します。 *(残りの部分を更新し、手動で複数のものをチェックしたいから、それらを除外しました)* –

+0

あなたはあなたが使用している完全なクエリを表示できますか? –

+0

nevermind、私は事故で逃した他の2人の犯罪者を見つけました:) ...助けてくれてありがとう:)私はそれを今すぐに持っていると思う:) :)私は 'Max'ソリューションを使わなかった私は何が更新されるかについて具体的にする必要がある、私は正しい方向に私を得たので、この答えを選択します。 –

3

Attemp 3は構文的に正しいですが、問題は表のデータです。master_customerによってフィルタされたように見えます。trading_codeは複数の行を返します。これは正しいです?この場合、1つのtrading_codeに異なるgpidの値が関連付けられている可能性があるため、探している更新を行う方法はありません。

回避方法:リンクされたすべてのレコードに対して1つのgpid値まさにそこだ場合にのみアップデート:私は、複数の `gpid`で` mccust_code`を除外することを

UPDATE dim_trading_accounts dta 
SET dta.gpid = (SELECT MIN(mc.gpid) 
       FROM master_customer mc 
       WHERE dta.trading_code = upper(mc.mcust_code)) 
WHERE (SELECT COUNT(DISTINCT gpid) 
       FROM master_customer mc 
       WHERE dta.trading_code = upper(mc.mcust_code)) = 1; 
関連する問題