2012-09-29 93 views
1

我有一個表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年9月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,我將插入一個新的。

如何爲此插入寫入查詢?

回答

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 

現在,從表1中刪除所有記錄。

接下來,在表格1中插入新記錄。我們將使用GROUP來整理您的記錄。這是示例代碼,在這種情況下,在特定條件下會破壞您的主鍵,但您明白我的觀點。按摩分組的邏輯,以滿足您的需求:

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

在我看來,這是唯一可以接受的方式來做到這一點。

我也非常積極地認爲,在實踐中我永遠不會遇到這種情況,因爲它是一個破碎的設計。需要給這個數據庫模式一些想法。將每個實體和事件存儲在它自己的表中。根據我對您的情況的有限瞭解,我正在考慮帳戶,帳戶_聯繫_嘗試。

+0

這實際上可能是最快的方法。另一種方法是執行多個查詢,包括選擇,更新和插入。 –

+0

等待,如果插入日期不同,此方法將會出錯。該錯誤是違反PRIMARY KEY約束。 – GLP

+0

你是對的。我讀錯了pkey。但是,我不是在這裏爲你寫代碼。這個概念站起來。刪除,選擇w /組,然後插入。調整你的分組邏輯,以確保獨特的2-col PKeys –