あるテーブルから別のテーブルにデータをマージする必要があります。
データはフラットファイルを介して配信されます。そのため、本番環境に移行する前に、まずロードテーブルを使用します。
ロードテーブルにフィールドを追加するloadtabletime
ので、一度に複数のファイルがロードテーブルに挿入されている場合でも、一度に1つのファイルのみをマージするようにdb2に指示できます。
ロードテーブルは、、loaddlp.reservation_insert
プロダクションテーブルはdlp.reservation
です。
これは私の質問です:
MERGE INTO DLP.RESERVATION AS E
USING LOADDLP.RESERVATION_INSERT as et
on e.TICKET_SERVER = et.TICKET_SERVER
and e.RES_ID = et.RES_ID
and et.LOADTABLETIME = '2012-06-09 10:44:17.42236'
WHEN MATCHED THEN UPDATE SET (foo) = (bar)
WHEN NOT MATCHED THEN INSERT (xyz) VALUES (;akdjf)
ロードテーブルの主キーは、、ticket_server
およびres_id
;loadtabletime
です。製品テーブルの場合はticket_server
、とres_id
です。
このクエリは次のエラーで失敗します。
ステージから実動テーブルRESERVATIONにデータを更新できませんでした。[[23505] [IBM] [CLI Driver] [DB2 / LINUXX8664] SQL0803N INSERTステートメント、UPDATEステートメント、またはDELETEステートメントによって引き起こされた外部キー更新の1つ以上の値は、主キー、一意性制約、または一意性のために無効です。 「1」で識別される索引は、表「DLP.RESERVATION」が索引キーの値を重複させないように制約します。SQLSTATE = 23505
しかし、句loadtabletime
から削除するwhere
と、魔法のように機能します。もちろん、これはオプションではありません。複数のファイルがロードテーブルにロードされると、挿入時にpk違反が発生する可能性があるためです。
私が走るとき:
SELECT count(*)
from loaddlp.reservation_insert
where LOADTABLETIME = '2012-06-09 10:44:17.42236';
正しい結果が得られます。
誰かがクエリの何が問題になっているのか考えていますか?