1

テーブル table1 (account, last_contact_date, insert_date) があり、account と last_contact_date が主キーです。insert_date は、getdate() を呼び出して記録が追加された時刻で設定されます。table1 を更新するために使用する一時テーブル #temp(account, last_contact_date) もあります。

サンプルデータは次のとおりです。

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 からすべてのレコードを削除します。

次に、新しいレコードをテーブル 1 に挿入します。を使っGROUPてあなたの記録を整理します。これは、この場合、特定の条件下で主キーを壊すサンプル コードですが、私の言いたいことは理解できます。ニーズに合わせてグループ化ロジックを調整します。

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 に答える