web-dev-qa-db-ja.com

SQLマージエラー:MERGEステートメントがUPDATEまたはDELETEを試行しました

ソーステーブルがあります

select 54371 Id, 'foo' [CreateBy], '2016-10-24 09:29:18.548'[CreateDate], 'foo'[UpdateBy],  '2016-10-24 09:29:18.548'[UpdateDate], 'E'[MT], 185761[MID], 3[BGID]
union
select 54372, 'foo', '2016-10-24 09:30:18.548', 'foo',  '2016-10-24 09:30:18.548',  'E', 185761, 2

とターゲットテーブル

select 54379 Id, 'foo' [CreateBy], '2016-10-24 09:29:18.548'[CreateDate], 'foo'[UpdateBy],  '2016-10-24 10:29:18.548'[UpdateDate], 'E'[MT], 185761[MID], 3[BGID]

私が欲しいのは、MT、MID、

  1. 存在しない場合は挿入
  2. bGIDが一致する場合に更新
  3. bGIDが一致しない場合は削除します

SQLマージステートメントを使用するとエラーが発生する

MERGEステートメントが同じ行を複数回UPDATEまたはDELETEしようとしました。これは、ターゲット行が複数のソース行と一致する場合に発生します。 MERGEステートメントは、ターゲットテーブルの同じ行を複数回UPDATE/DELETEすることはできません。 ON句を調整して、ターゲット行が最大で1つのソース行と一致するようにするか、GROUP BY句を使用してソース行をグループ化します。`

私のマージはこんな感じです

MERGE   
  FooBar AS target
USING
(
SELECT
E.[Id],
E.[CreateBy],
E.[CreateDate],
E.[UpdateBy],
E.[UpdateDate],
E.[MT],
E.[MID],
E.[BGID]
FROM @FooBar E
) AS source
ON
source.MID = target.MID
AND source.MT = target.MT
WHEN MATCHED and target.[BGID] = source.[BGID] THEN
UPDATE SET
target.[UpdateBy] = Source.[UpdateBy]
,target.[UpdateDate] = Source.[UpdateDate]
When Matched and source.BGID <> target.BGID THEN
DELETE
WHEN NOT MATCHED THEN
INSERT([CreateBy]
,[CreateDate]
,[UpdateBy]
,[UpdateDate]
,[MT]
,[MID]
,[BGID])
VALUES
(
Source.[CreateBy]
,Source.[CreateDate]
,Source.[UpdateBy]
,Source.[UpdateDate]
,Source.[MT]
,Source.[MID]
,Source.[BGID]
);

何が欠けていますか?

7
Nikhil Agrawal

ON source.MappingId = target.MappingIdのテーブルに参加しています。

データサンプルでは、​​同じMappingId = 185761の行が1行以上あります。だからここにあなたは得ました:

MERGEステートメントは、ターゲットテーブルの同じ行を複数回UPDATE/DELETEすることはできません。

sourceテーブルとtargetテーブルを結合するには、いくつかの一意の列の組み合わせを指定する必要があります。

10
gofr1