如何根据插入日期插入

时间:2012-10-04 19:23:01

标签: sql-server

我有一个表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

有人可以帮我写这个查询吗?我真的没想到了。

更新:我最后用光标写上面的逻辑。感谢。

1 个答案:

答案 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事务中以防止这种情况或使用其他逻辑锁定机制。