1

我有一个表 table1 (account, last_contact_date, insert_date),account 和 last_contact_date 是主键。insert_date 通过调用 getdate() 设置为添加记录的时间。我还有一个临时表 #temp(account, last_contact_date) 用于更新 table1。

以下是样本数据:

table1
account    last_contact_date    insert_date
1          2012-09-01           2012-09-28
2          2012-09-01           2012-09-28
3          2012-09-01           2012-09-28

#temp 
account    last_contact_date
1          2012-09-27
2          2012-09-27  
3          2012-08-01

结果表取决于插入日期。如果日期是 2012-09-28,结果将是

table1
account    last_contact_date    insert_date
1          2012-09-27           2012-09-28
2          2012-09-27           2012-09-28
3          2012-09-01           2012-09-28

如果日期是 2012-09-29,结果将是

table1
account    last_contact_date    insert_date
1          2012-09-01           2012-09-28
2          2012-09-01           2012-09-28
3          2012-09-01           2012-09-28
1          2012-09-27           2012-09-29
2          2012-09-27           2012-09-29

基本上规则是(1)如果插入日期是同一天,我将选择最新的 last_contact_date,否则,(2)如果 last_contact_date 晚于当前的 last_contact_date,我将插入一个新的。

如何为此插入编写查询?

4

1 回答 1

1

这不是真正的插入。它是基于特定逻辑的更新或插入。

所以,我推荐的是这个。

将所有记录转储到一个新的临时表中。您将按原样将表 1 中的记录转储到临时表中。您将按原样将 #temp 帐户中的记录转储到新的临时表中,但将 insert_date 列设置为当前日期。

因此,您的新临时表将如下所示:

#holding tank 
account    last_contact_date    insert_date
1          2012-09-01           2012-09-28
2          2012-09-01           2012-09-28
3          2012-09-01           2012-09-28
1          2012-09-27           2012-09-29
2          2012-09-27           2012-09-29
3          2012-08-01           2012-09-29

现在,从 table1 中删除所有记录。

接下来,将新记录插入表一。我们将使用 aGROUP来整理您的记录。这是示例代码,在这种情况下,它会在某些条件下破坏您的主键,但您明白我的意思。按摩分组逻辑以满足您的需求:

Insert into Table1
select
   account,
   max(last_contact_date),
   insert_date
from
  #HoldingTank
group by
  account, insert_date

在我看来,这是唯一可以接受的方法。

我也很肯定,我在实践中永远不会遇到这种情况,因为它是一个破碎的设计。需要对此数据库模式进行一些思考。将每个实体和事件存储在自己的表中。根据我对您的情况的有限了解,我正在考虑 Accounts,Account_Contact_Attempts。

于 2012-09-29T04:21:16.320 回答