2012-05-09 15 views
2

私はDB2データベースにlocations,itemsmovement_historyという3つのテーブルを持っています。 itemsテーブルの外部キーはlocation_idlocationsです。 movement_historyテーブルの外部キーはitem_idで、itemsに、2つの外部キーlocation_id_beforelocation_id_afterlocationsにあります。外部参照がない場合は行を削除するか、それ以外の場合は更新

itemsまたはmovement_historyに行がない場合は、locationを削除します。 locationがどこかで参照されている場合はですが、削除したものとしてマークするように更新したいだけです。 1つの声明でこれを行う方法はありますか?これを行う最善の方法は何ですか?このような

+1

SQL文では、一度にに一つのことをやらせます。あなたがしたいのは、1つのステートメント内のUPDATEとDELETEです。私はそれが可能だとは思いません。 – NealB

+0

私は、DB2の 'MERGE INTO ...更新とマッチした時... INSERT ...'クエリとマッチしなかった時に、更新/挿入の代わりに削除/更新を行うことを望んでいました。 –

+0

...実際には、私は削除/更新で 'MERGE INTO'構文を使うことができるのだろうかと思います。私はそれを調べます。 –

答えて

1

てみコマンド:SELECT、UPDATE、INSERTまたはDELETEを:

MERGE INTO LOCATIONS AS LOC 
USING (
    SELECT Q1.ID, COALESCE(Q4.LOCATION_AFTER, Q3.LOCATION_BEFORE, Q2.LOCATION) AS ANY_REF 
    FROM LOCATIONS Q1 
    LEFT OUTER JOIN ITEMS Q2 ON Q2.LOCATION = Q1.ID 
    LEFT OUTER JOIN MOVEMENT_HISTORY Q3 ON Q3.LOCATION_BEFORE = Q1.ID 
    LEFT OUTER JOIN MOVEMENT_HISTORY Q4 ON Q4.LOCATION_AFTER = Q1.ID) AS T1 
    ON LOC.ID = T1.ID 
WHEN MATCHED AND T1.ANY_REF IS NOT NULL THEN 
    UPDATE SET ACTUAL = 'N' 
WHEN MATCHED AND T1.ANY_REF IS NULL THEN 
    DELETE 
関連する問題