これはおそらくおなじみの問題ですが、検索で答えが見つかりませんでした。すべての非キー列で COALESCE を含むソリューション (以下に示す) があります。動的 TSQL ルーチンがあるかどうか、またはすべての列に明示的に名前を付けることを含まないクエリを公式化する別の方法があるかどうか疑問に思っています。
同じフィールド名とタイプを持つ 2 つのテーブル "targetTable" と "deltaTable" があります。どちらも一意のキー「id」を持っています。
Deltatable には、targetTable の対応する行で変更されたデータがあります。値が変更されていない列はすべて null です。deltaTable の対応する行に null 以外の値を持つ targetTable の列を更新したいと考えています。DetlaTable.id は TargetTable.id に存在することが保証されており、フィールドを NULL に更新したくありません。
私は SQL Server 2005 を使用しています (merge ステートメントがありませんが、それが役立つとは知りません)。
したがって、targetTable 行が次のように見える場合
id | name | dob | next_appt
5 Bill 1-1-2012 | 3-3-2015
deltaTable 行は次のようになります
id | name | dob | next_appt
5 | NULL | NULL | 4-4-2015
targetTable を次のように更新したい
id | name | dob | next_appt
5 Bill 1-1-2012 | 4-4-2015
私が今改善したいのは、次のとおりです。
UPDATE target
SET target.colA = COALESCE(delta.colA, target.colA),
target.colN = COALESCE(delta.colN, target.colN)
FROM delta JOIN target on delta.id = target.id