我有一个表tbl1(account,last_contact_date,insert_date)。我定义了主键是account和last_contact_date。例如
account last_contact_date insert_date
0001 09/01/2012 10/01/2012
0001 09/02/2012 10/02/2012
现在我有了一条新记录,来自另一个临时表#tmp(account,last_contact_date)。基于last_contact_date或insert_date,我将有条件地插入它: (1)如果插入日期是同一天,我将使用max last_contact_date更新帐户;
(0001, 09/01/2012, 10/02/2012) --no
(0001, 09/02/2012, 10/02/2012) --no
(0001, 09/03/2012, 10/02/2012) --update
(2)如果插入日期是前一天,则什么都不做(我知道这不会发生)
(0001, 09/01/2012, 10/01/2012) --no
(0001, 09/02/2012, 10/01/2012) --no
(0001, 09/03/2012, 10/01/2012) --no
(3)如果插入日期是第二天或更晚,我将插入一条最大的last_contact_date新记录。
(0001, 09/01/2012, 10/03/2012) --no
(0001, 09/02/2012, 10/03/2012) --no
(0001, 09/03/2012, 10/03/2012) --insert
有人可以帮我写这个查询吗?我真的没想到了。
更新:我最后用光标写上面的逻辑。感谢。
答案 0 :(得分:0)
你需要一个IF来处理这种情况,就像这样(假设你有变量中的当前帐户和insert_date:
-- First try to update
UPDATE tbl1 SET <whatever you need to update>
WHERE account = @account AND insert_date = @insert_date
AND last_contact_date =
(SELECT MAX(last_contact_date) FROM tbl1
WHERE account = @account AND insert_date = @insert_date)
-- Update failed because no matching record was found?
IF @@ROWCOUNT = 0
BEGIN
INSERT <new record>
END
如果多个进程/线程同时执行此操作,您可能会遇到主键冲突,因为没有人找到记录然后都尝试插入。您需要将此代码放入SERIALIZABLE事务中以防止这种情况或使用其他逻辑锁定机制。