2017-07-05 12 views
0

T-SQL MERGEステートメントを使用したクエリがあります。パフォーマンスの問題のために、私はIF Exists UpdateIf Not Exists Insertを使ってクエリを書いています。 Insert/Updateは何の問題もなく書いています。しかし、私はDELETEを処理することができません。何人かが私を助けてくれますか?ここでSQL ServerのMERGEステートメントDELETE代替

は、単一のDELETEステートメントで

WHEN NOT MATCHED BY SOURCE THEN 
DELETE member_topic; 

を処理する方法をサンプル

---SAMPLE MERGE STATEMENT 
MERGE 
    member_topic AS target 
USING 
    someOtherTable AS source 
ON 
    target.mt_member = source.mt_member 

WHEN MATCHED THEN 
    UPDATE SET target.mt_notes = source.mt_notes 
WHEN NOT MATCHED THEN 
    INSERT (mt_member, mt_topic, mt_notes) VALUES (source.mt_member, source.mt_notes) 

WHEN NOT MATCHED BY SOURCE THEN 
DELETE member_topic; 


--UPDATE 

UPDATE T SET T.mt_notes = S.mt_notes 
FROM member_topic T 
JOIN someOtherTable S ON T.mt_member=S.mt_member 


--INSERT 

INSERT INTO member_topic(mt_member, mt_topic, mt_notes) 
SELECT mt_member, mt_topic, mt_notes 
FROM someOtherTable S 
WHERE NOT EXISTS(SELECT 1 
       FROM member_topic T 
       WHERE T.mt_member=S.mt_member) 

です。 PROCで始まりと終わり

MERGE dbo.Tablet AS TARGET 
    USING dbo.QueryView AS SOURCE 
    ON ( 
     TARGET.[ID] = SOURCE.[ID] 
     ) 

WHEN MATCHED 

    THEN 
UPDATE SET 

TARGET.[ID] = SOURCE.[ID] 

WHEN NOT MATCHED BY TARGET THEN 
INSERT (ID, [Name] ) 
VALUES (SOURCE.[ID], SOURCE.[Name] ) 

WHEN NOT MATCHED BY SOURCE THEN 
DELETE; 
+4

確かにしてみてください、あなたは –

+0

後に、これまでお使いのデータベース構造をやっているサンプルコードを投稿してくださいサンプルコード、あなたが望むもの、そしてあなたが得ているもの。 –

答えて

1

サンプルスクリプトは

DELETE T 
FROM member_topic T 
WHERE NOT EXISTS(SELECT 1 
       FROM someOtherTable S 
       WHERE T.mt_member=S.mt_member) 
+0

どのように扱うかソースと一致しないとき DELETE;インクリメンタルロードを実行している場合は、DELETE文の1つである – Ram

+0

@Ramを実行すると、deleteコマンドは不要です。特定の行を削除したい場合を除き、ソースによって一致しないすべてのレコードを削除するには、単一ステートメントで十分です。 –

+0

AFAIU OPは、1つのMERGEステートメントをINSERT、UPDATE、DELETEの3つの独立したステートメントに置き換えようとします。 – Serg

0

の間に埋め込まれる

0
DELETE t 
FROM member_topic t 
    LEFT JOIN someOtherTable s ON t.mt_member = s.mt_member 
WHERE s.mt_member IS NULL 
関連する問題