1

私はテーブルと配列を持っていて、それらをマージしたいと思っています。

構造 (t=ターゲット、s=ソース):

ID          gID
----------- -----------
13          1
14          1
15          1
16          1
17          2
18          2
19          2

t.ID=s.ID および t.gID=s.gID の場合、何も起こりません。s.ID < 0 の場合は挿入します。s.ID が存在しない場合は削除します。

マージクエリでこれを構築することはできません:

merge tableT as t
using @array as s
on (t.ID = s.ID) and (t.gID=s.gID)
when not matched and s.ID < 0 then
insert into
when not matched by source then delete;

@array の各行の gID が 1 の場合、クエリは gID=2 のすべてを削除します。ただし、影響を受けるのは gID=1 だけです。

誰かがこれを解決する方法を知っていますか?

4

2 に答える 2

1

gID次のように、ターゲットをソースと同じ行だけに制限する必要があるようです。

with tgt as (
  select *
  from tableT
  where gID in (select gID from @array)
)
merge tgt as t
using @array as s
on (t.ID = s.ID) and (t.gID=s.gID)
when not matched and s.ID < 0 then
insert into
when not matched by source then delete;
于 2013-02-08T10:57:01.113 に答える
0
when not matched by source then delete;
    ^^^^^^^^^^^^^

一致したものだけを削除したい場合は、not.

于 2013-02-08T10:41:20.940 に答える