Requête pour la mise à jour d'une autre table lors de l'insertion de données dans une table

Je suis à la search de solution pour mettre à jour et insert Table2 tout en insérant des données dans Table1,

Tableau 1

--------------------------------------- | id |Student name | % | Date of Exam | --------------------------------------- | 1 | Tom | 80 | 12/03/2015 | | 2 | Jack | 90 | 12/03/2015 | | 1 | Tom | 85 | 21/05/2015 | --------------------------------------- 

Tableau 2 (à mettre à jour)

 --------------- | id | % | --------------- | 1 | 85 | | 2 | 90 | --------------- 

Si le "id" n'est pas présent dans la Table2 que je veux insert, et si elle existe, la rangée de la table devrait être mise à jour.

S'il vous plaît, aidez-moi à find une solution.

Merci d'avance.

Si vous avez besoin d'une solution de table persistante, vous pouvez utiliser un triggersur AFTER pour recalculer le dernier résultat chaque fois qu'une ligne est insérée dans Table1 et insert / mettre à jour Table2 ("LastScore") en conséquence, en utilisant les pseudo-lignes inserted .

 CREATE TRIGGER tCalcLastScore ON Table1 AFTER INSERT, UPDATE AS BEGIN DELETE a FROM LastScore a INNER JOIN inserted i on i.id = a.id; INSERT INTO LastScore(id, [Percent]) SELECT id, [Percent] FROM ( SELECT t1.id, t1.[Percent], ROW_NUMBER() OVER (PARTITION BY t1.id ORDER BY t1.DateOfExam DESC) AS RowId FROM Table1 t1 INNER JOIN inserted i ON i.id = t1.id ) x WHERE RowId = 1; END; 

SqlFiddle ici

Remarques

  • Rappelez-vous que le triggersur doit gérer plusieurs lignes inserted – J'ai utilisé une fonction ROW_NUMBER avec un filter pour déterminer la dernière ligne pour chaque élève.
  • Si les lignes peuvent être supprimées de la première table, vous devez également append un triggersur à ON DELETED et gérer les pseudo-lignes deleted
  • J'ai été paresseux et juste supprimé + réinséré dans la deuxième table ( LastScore ), mais une fusion est également possible.

Cependant, une alternative non persistante consiste à calculer le dernier score chaque fois à la volée en utilisant une vue:

 CREATE VIEW LastScore AS SELECT id, [Percent] FROM ( SELECT id, [Percent], ROW_NUMBER() OVER (PARTITION BY t1.id ORDER BY t1.DateOfExam DESC) AS RowId FROM Table1 t1 ) x WHERE RowId = 1; 

Voir le violon

Les performances de la vue doivent être raisonnables à condition qu'il existe un index sur Table1(id, DateOfExam)

Vous pouvez utiliser Trigger (lors de l'insertion) ou une procédure stockée pour insert ou mettre à jour une ou plusieurs tables.

Si la table1 est mise à jour, table2 doit également être mise à jour en conséquence. Écrire un triggersur sur l'insertion et la mise à jour serait utile.