2

問題

SET が外部結合テーブルを参照する更新クエリを作成する必要があります。

これは SQL Server でかなり簡単に実行できますが、更新クエリでは単一のテーブルしか許可されていないため、Oracle の構文を理解するのにかなりの時間を費やしています。

次の Oracle クエリを作成しました。

UPDATE SalesExt_tmp tmp
SET slsrep = (SELECT three_dig_rep 
              FROM dw_sls_rep_conv sls
              WHERE sls.aims_rep = tmp.slsrep)
WHERE EXISTS (SELECT three_dig_rep
              FROM dw_sls_rep_conv sls
              WHERE sls.aims_rep = tmp.slsrep)
          AND tmp.sysind = 'AIM';

これで交差は処理されますが、dw_sls_rep_conv に同等の一致がない SalesExt_tmp の値を処理する必要があります (null 値をデフォルト値に設定する case ステートメントを追加する予定です)。これを行うには、dw_sls_rep_conv を外部結合テーブルとして設定する必要があります。しかし、これは私が立ち往生するところです。

SQL サーバーの例

SQL Server では、更新クエリに複数のテーブルを含めることができるため、ソリューションは簡単です。

UPDATE SalesExt_tmp tmp 
LEFT JOIN dw_sls_rep_conv sls ON sls.aims_rep = tmp.slsrep 
SET tmp.slsrep = sls.three_dig_rep
WHERE tmp.sysind = 'AIM';

しかし、私は一生、Oracleでこれを行う方法を理解できません。このクエリにより、場合によっては slsrep フィールドが NULL に設定され、この操作が許可されないのではないかと心配になることを理解しています。

質問

1)まず、これはOracleで可能ですか?(そうじゃなきゃいけないよね?)

2) これを実現するには、クエリをどのように再構築する必要がありますか? WHERE EXISTS 句を削除する必要があると思いますが、JOIN を配置する場所についてはまだ悩んでいます。

4

2 に答える 2

3

私の理解が正しければ、dw_sls_rep_convテーブルに一致するものがない場合、値を NULL に設定しますか? その場合は、条件をドロップするだけEXISTSですべての行が更新されます。

UPDATE SalesExt_tmp tmp
SET slsrep = (SELECT three_dig_rep 
              FROM dw_sls_rep_conv sls
              WHERE sls.aims_rep = tmp.slsrep)
WHERE tmp.sysind = 'AIM';

dw_sls_rep_convテーブルに一致するものがある場合、slsrep列は選択された値で更新され、そうでない場合は で更新されますNULL

于 2013-11-14T18:14:18.220 に答える
2

次のように述べたように、外部結合を実行する where 句でサブクエリを使用することを検討しましたか?

UPDATE SalesExt_tmp tmp 
SET slsrep = (SELECT three_dig_rep 
FROM dw_sls_rep_conv sls WHERE sls.aims_rep = tmp.slsrep)      
WHERE 
 tmp.rowid in 
(SELECT tmp1.rowid 
 FROM SalesExt_tmp tmp1, 
      dw_sls_rep_conv sls 
 WHERE 
 tmp1.slsrep = sls.aims_rep (+) 
 AND tmp1.sysind = 'AIM' ); 
于 2013-11-14T18:36:28.787 に答える