2012-09-29 3 views
1

J'ai une table table1 (account, last_contact_date, insert_date), compte et last_contact_date sont des clés primaires. Le paramètre insert_date est défini avec l'heure à laquelle le recored est ajouté en appelant getdate(). J'ai aussi une table temporaire #temp (account, last_contact_date) que j'utilise pour mettre à jour la table1.comment insérer en fonction de la date

Voici des exemples de données:

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 

Le tableau de résultat dépend de la date d'insertion. Si la date est 2012-09-28, le résultat sera

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 

Si la date est 29/09/2012, le résultat sera

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 

Fondamentalement, la règle est (1) si la date d'insertion est le même jour, je choisirai le dernier last_contact_date, sinon, (2) si le last_contact_date est postérieur au dernier current_contact_date, je vais en insérer un nouveau.

Comment écrire une requête pour cet insert?

Répondre

1

Ce n'est pas vraiment un insert. C'est une mise à jour ou un insert basé sur une certaine logique.

Donc, ce que je recommande est ceci.

Vider tous les enregistrements dans une nouvelle table temporaire. Vous déverserez les enregistrements de la table 1 dans la table temporaire en l'état. Vous allez déverser les enregistrements du compte #temp dans la nouvelle table temporaire en l'état, mais définissez la colonne insert_date comme date actuelle.

Ainsi, votre nouvelle table temporaire ressemblerait à ceci:

#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 

Maintenant, supprimer tous les enregistrements de table1.

Ensuite, insérez de nouveaux enregistrements dans la première table. Nous utiliserons un pour trier vos dossiers. Ceci est un exemple de code qui, dans ce cas, va casser votre clé primaire dans certaines conditions, mais vous obtenez mon point. Massez la logique de regroupement en fonction de vos besoins:

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

À mon avis, c'est la seule façon acceptable de le faire.

Je suis également assez positif que je ne rencontrerais jamais cette situation dans la pratique, parce que c'est une conception cassée. Certaines réflexions doivent être données à ce schéma de base de données. Stocker chaque entité et événement dans sa propre table. Sur la base de ma connaissance limitée de votre situation, je pense à Accounts, Account_Contact_Attempts.

+0

C'est probablement le moyen le plus rapide de le faire. L'alternative consiste à effectuer plusieurs requêtes, notamment select, update et insert. –

+0

Attendez, cette méthode obtiendra une erreur si la date d'insertion est différente. L'erreur est la violation de la contrainte PRIMARY KEY. – GLP

+0

Vous avez raison. J'ai lu le pkey mal. Cependant, je ne suis pas ici pour écrire votre code pour vous. Le concept reste. Supprimer, sélectionnez w/group et Insert. Ajustez votre logique de regroupement pour vous assurer d'avoir des PKeys à 2 colonnes uniques. –

Questions connexes