私は正しい文で間違った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
おかげで、
アミット
は、あなたは、単に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
こんにちは、 私はこの条件を使用できません: とa。 NAME = b.NAMEおよびa。 DESC = b。 DESCおよびa.SRC_TYPE_CD = b.SRC_TYPE_CDは名前とdescが他の表に存在しないためです。 = condtionを使用すると、テストしたサンプルに対して正しい結果が得られませんでした。 他のオプションはありますか?私は合併しようと思った。 – user3901666
TASMのためにコードが失敗していない場合は、「複数のソース行によって更新されたターゲット行」のようなエラーで失敗します。ターゲット表の各行は、ソース内の1つの行を正確にマージする必要があります。あなたのケースでそれをどうやって得るかわからない。 – dnoeth