1

あるテーブルから別のテーブルにデータをマージする必要があります。

データはフラットファイルを介して配信されます。そのため、本番環境に移行する前に、まずロードテーブルを使用します。

ロードテーブルにフィールドを追加する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';

正しい結果が得られます。

誰かがクエリの何が問題になっているのか考えていますか?

4

1 に答える 1

1

わかりました、私はそれを解決しました。

キーは、「使用」フィールドに選択クエリを追加することでした。

例:

    MERGE INTO DLP.RESERVATION AS e
USING (select * from LOADDLP.RESERVATION_INSERT WHERE LOADTABLETIME = '2012-06-09 10:44:17.42236') as et 
   on e.TICKET_SERVER = et.TICKET_SERVER 
  and e.RES_ID = et.RES_ID  
 WHEN MATCHED THEN UPDATE SET (foo) = (bar) 
 WHEN NOT MATCHED THEN INSERT (xyz) VALUES (;akdjf)
于 2012-06-29T10:59:50.213 に答える