-1

今日、私はこの質問をして、探していた答えを得ました。今、私はフォローアップの質問があります:

私が欲しいもの:

MERGE で、ターゲット テーブルの各列の値を行ごとに、ソース テーブルの対応する値と比較ORし、WHEN MATCHED ANDブロック内の で区切られたロジックに基づいて更新を行います。

ブロック内の で区切られたロジックのいずれかが trueの場合、私が書いたコード (下の図) がTHEN UPDATE SETブロックにリストされている更新を行うのではないかと心配しています。ORWHEN MATCHED AND

私の勘が正しければ、コードを書き直して、私が望むように動作させる方法について何か提案はありますか?

ここに画像の説明を入力

4

2 に答える 2

9

データがなく、画像からクエリを再入力したくないので、必要なものを示すサンプルを作成しました。

create table t (ID int not null,Col1 int null,Col2 int null)
create table s (ID int not null,Col1 int null,Col2 int null)

insert into t(ID,Col1,Col2) values (1,1,null),(2,null,2)
insert into s(ID,Col1,Col2) values (1,3,4),(2,5,6),(3,7,8)

;merge into t
using s
on t.ID = s.ID
when not matched then insert (ID,Col1,Col2) values (s.ID,s.Col1,s.Col2)
when matched then update
set Col1 = COALESCE(t.Col1,s.Col1),
Col2 = COALESCE(t.Col2,s.Col2)
;
select * from t

結果:

ID          Col1        Col2
----------- ----------- -----------
1           1           4
2           5           2
3           7           8

列の値が既にある場合に列の値を更新しないようにするためにキーを使用COALESCEする場所 (これはあなたが達成しようとしているものだと思います)

于 2012-12-18T15:25:35.083 に答える
2

質問の意味がよくわかりません。つまり、何を言っているのかよくわかりません。余分な末尾の OR を差し引くと、2 つの条件があります。これらのいずれか (または両方) が TRUE と評価された場合、ターゲット テーブルは THEN UPDATE によって更新されます。

ただし、unique_key で MATCH を行っており、最初の条件 (s.unique_key IS NOT NULL AND t.unique_key IS NULL) が true になることはありません。これが true の場合、レコードは一致しないためです。したがって、OR の最初の部分は無視できます。

また、レコードは unique_key で一致しているため、unique_key のソース値でターゲットを更新することは完全に冗長です。それらはすでに同じです。

したがって、現在書かれているように、MERGE は次のとおりです。

MERGE dbo.input311 AS T
USING dbo.input311staging AS S
ON S.unique_key = S.unique_key
WHEN NOT MATCHED BY TARGET THEN
   INSERT
     -- insert statement I'm too lazy to type
WHEN MATCHED AND s.created_date IS NOT NULL AND t.created_date IS NULL THEN
   UPDATE SET t.created_date = s.created_date
于 2012-12-18T05:43:54.160 に答える