2017-01-27 11 views
0

私は正しい文で間違ったIDを更新する必要がある更新文に取り組んでいます。TDWMフィルタvoilation:悪い制約のない製品結合

CREATE TABLE DP_DB.CE_TEST AS 
(SELECT * FROM DB.EVNT WHERE 
SRC_TYPE_CD='CRM' and CODE is not null) 
WITH DATA AND STATS 
ON COMMIT PRESERVE ROWS; 

揮発性テーブルとCE_TESTの更新:テスト目的のために、元のような表を作成

CREATE VOLATILE TABLE VT 
AS 
(
SELECT 
    NAME 
    ,DESC 
    ,FIRST_VALUE(CODE) 
    OVER (PARTITION BY NAME,DESC,SRC_TYPE_CD 
      ORDER BY CODE) AS CORRECT_CODE 
    ,CODE AS INCORRECT_CODE 
    ,SRC_TYPE_CD 
FROM DB.CPT 
QUALIFY 
    COUNT(*) 
    OVER (PARTITION BY NAME,DESC,SRC_TYPE_CD 
     ORDER BY CODE 
     ROWS UNBOUNDED PRECEDING) > 1 
     ) WITH DATA 
ON COMMIT PRESERVE ROWS; 

:揮発性の表に正しいと不正なコードを撮影 : 以下は私のコードです:

update a from DP_DB.CE_TEST a, vt b 
set CODE= b.CORRECT_CODE where 
a.CODE in (select b.INCORRECT_CODE from VT) 

上記の更新プログラムは、製品結合違反で失敗しています。私は2つのテーブルに他の一致する列がありません。このクエリを最適化するために他に何ができますか?以下は

VTからのサンプルです:

Name    Desc CORRECT_CODE INCORRECT_CODE SRC_TYPE_CD 
700 Calls Service 100 592    601 CRM 
700 Calls Service 100 592    595 CRM 
700 Calls Service 100 592    597 CRM 
700 Calls Service 100 592    598 CRM 
700 Calls Service 100 592    594 CRM 

おかげで、

アミット

+1

は、あなたは、単にDP_DB.CE_TEST、VTのB セットCODE = b.CORRECT_CODE a.CODE = b.INCORRECT_CODEから 'アップデートaを使用することはできませんする必要があります。 NAME = b.NAMEおよびa。 DESC = b。 DESCとa.SRC_TYPE_CD = b.SRC_TYPE_CD'これは、CREATE TABLEでパーティション化する方法と同じようです。もちろん、これは4つの列の組み合わせが一意であることを前提としています。 – dnoeth

+0

こんにちは、 私はこの条件を使用できません: とa。 NAME = b.NAMEおよびa。 DESC = b。 DESCおよびa.SRC_TYPE_CD = b.SRC_TYPE_CDは名前とdescが他の表に存在しないためです。 = condtionを使用すると、テストしたサンプルに対して正しい結果が得られませんでした。 他のオプションはありますか?私は合併しようと思った。 – user3901666

+0

TASMのためにコードが失敗していない場合は、「複数のソース行によって更新されたターゲット行」のようなエラーで失敗します。ターゲット表の各行は、ソース内の1つの行を正確にマージする必要があります。あなたのケースでそれをどうやって得るかわからない。 – dnoeth

答えて

0

あなたはまだ(あなたが取り除くために必要な複数のソースの行によって更新ターゲット行でエラーが発生することがあります後でname、descなどの他の列に適格ではないため、VT内の正しい/誤った組み合わせを複製する))

update a from DP_DB.CE_TEST a, vt b 
set CODE= b.CORRECT_CODE where 
a.CODE in (select b.INCORRECT_CODE from VT) 

はおそらく

update a from DP_DB.CE_TEST a, vt b 
set CODE= b.CORRECT_CODE 
where a.CODE = b.INCORRECT_CODE 
+0

こんにちはLombardo、 VTに重複した正しい/誤った組み合わせが表示されません。以下はサンプルです – user3901666

+0

これでも問題はありますか? – user3901666

関連する問題