2

我有一个表 tbl1(帐户,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)如果插入日期是同一天,我将用最大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

谁能帮我写这个查询?我真的没有主意了。

更新:我最终使用游标编写上述逻辑。谢谢。

4

1 回答 1

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 Transaction 以防止这种情况或使用其他一些逻辑锁定机制。

于 2012-10-04T19:48:44.650 回答