这可能是一个熟悉的问题,但我没有在搜索中找到答案。我确实有一个解决方案(如下所示),它在每个非键列上都涉及 COALESCE,我想知道是否有一个动态 TSQL 例程,或者可能是一种不涉及显式命名所有列的不同查询方式。
我有两个表,“targetTable”和“deltaTable”,它们具有相同的字段名称和类型。两者都有一个唯一的键“id”。
Deltatable 的数据已针对 targetTable 中的相应行进行了更改。值未更改的任何列都是空的。我想更新在 deltaTable 的相应行中具有非空值的 targetTable 中的列。DetlaTable.id 保证存在于 TargetTable.id 中,我永远不想将字段更新为 NULL。
我正在使用 SQL Server 2005(它没有合并语句,我不知道它会有所帮助)。
所以如果一个 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