我有一个table table1(account,last_contact_date,insert_date),account和last_contact_date是主键。 insert_date设置为通过调用getdate()添加recored的时间。我还有一个临时表#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,我将插入一个新的。
如何为此插入编写查询?
答案 0 :(得分: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中的所有记录。
接下来,将新记录插入表一。我们将使用GROUP
来整理您的记录。这是示例代码,在这种情况下,会在某些条件下破坏您的主键,但您明白我的观点。按摩分组逻辑以满足您的需求:
Insert into Table1
select
account,
max(last_contact_date),
insert_date
from
#HoldingTank
group by
account, insert_date
在我看来,这是唯一可以接受的方式。
我也非常肯定我在实践中永远不会遇到这种情况,因为它是一个破碎的设计。需要考虑一下这个数据库模式。将每个实体和事件存储在自己的表中。根据我对你的情况的有限了解,我在想Account,Account_Contact_Attempts。