根据其他列值更新所有/部分/无列

时间:2013-03-31 13:56:04

标签: sql sql-server tsql sql-update

我想知道是否可以在SQL中执行以下操作(我使用的是SQL Server 2008+,因此特定于供应商的内容可能暂时有用):

我有下表:

contact (contactid, fullname, fullname_timestamp, age, age_timestamp)

并且我只想更新那些' * _时间戳' column小于给定值。例如:

UPDATE contact
SET    fullname = 'john doe' IF fullname_timestamp < 12345,
       age = 30 IF age_timestamp < 12345
WHERE  contactid = 'abcde'

将这些条件放在WHERE子句中会产生一个&#34;全有或全无&#34;情景(我认为?),而我希望&#34;部分更新&#34;给出这些&#34;时间戳&#34;的记录约束

这可能/我做错了吗?建议欢迎。 提前谢谢。

编辑:@AaronBertrand提出了一些好点,我认为他们值得一提的是这个问题的附加信息。我还承认,我仍然在脑海中设置一个解决方案,我的想法可能存在差距。

我复制外部产品中包含的数据。该产品具有明确定义的CRUD事件管道。由于性能原因,我以异步方式管理这些事件。 这些事件可能无序排队等待以后处理。 我在上述产品的一个非异步管道阶段使用DateTime.UtcNow.Ticks时间戳 - 以便记录正确加时间戳 - 我有办法判断我要更新的数据是否即将更新是最新的或陈旧的。

-- sync pipeline --

record update 1 - timestamp 1
record update 2 - timestamp 2

-- async queue (can be out-of-order) --
record update 2 - timestamp 2 -> sent to db
record update 1 - timestamp 1 -> sent to db

-- replica db  --
record update 2 goes through, the timestamp is ok
record update 1 does nothing, timestamp shows data is out-of-date

是的,更新可以同时发生在同一记录中。用户可以同时修改相同或不同的字段。 希望这是有道理的。感谢大家的好评。

1 个答案:

答案 0 :(得分:4)

您可以在此使用CASE来测试特定列的具体情况,

UPDATE contact
SET    fullname = CASE WHEN fullname_timestamp < 12345 THEN 'john doe' ELSE fullname END,
       age = CASE WHEN age_timestamp < 12345 THEN 30 ELSE age END
WHERE  contactid = 'abcde'