2010-12-10 22 views
1

D'accord, je dois créer une structure de table semblable à la mienne plus simplifiée -Requête SQL pour obtenir et mettre à jour les données d'aujourd'hui et d'hier?

Test_Table: EmployeeId,Points,Date 
Test_Table1:Score,EmployeeId,Date 
Leaderboards_Table: Points,Score,EmployeeId,Day,Month,Year 

Maintenant je dois écrire une seule requête mettre à jour ou insérer dans quelque chose LeaderBoards_Table comme -

UPDATE Leaderboards_Table 
     SET Points=pts,Score=total_score 
FROM 
    (
     (SELECT 
      (SELECT SCORE from Test_Table1 WHERE Employee = @EmployeeId AND DAY(DATE)=10  AND MONTH(DATE)=12 AND YEAR(DATE)=2010) as pts 

    ) 
    Points as pts 
    from Test_Table where Employee = @EmployeeId AND DAY(DATE)=10 AND MONTH(DATE)=12 AND  YEAR(DATE)=2010 
) 
WHERE [email protected] and DAY=10 AND MONTH=12 AND YEAR=2010 

Maintenant, la ci-dessus requête seulement des mises à jour pour aujourd'hui ... ce que je veux faire est également mise à jour hier également dans une seule requête, je ne veux pas écrire une autre requête .... est donc de faire une seule requête pour mettre à jour hier et points d'aujourd'hui .

MISE À JOUR: Aussi, cette requête sera appelée beaucoup de fois ... donc ce serait génial d'avoir la requête la plus efficace pour cela.

Répondre

1

C'est beaucoup plus facile si vous changez de jointures au lieu de sous-requêtes.

UPDATE Leaderboards_Table 
SET 
    Points=t1.score, 
    Score=total_score 
FROM 
    Leaderboards_Table lt 
    INNER JOIN Test_Table1 t1 
    ON lt.employee_ID = t1.employee_id 
    INNER JOIN Test_Table t 
    ON lt.employee_ID = t1.employee_id 
     and lt.date = t1.date 
WHERE 
[email protected] and DAY IN (9,10) AND MONTH=12 AND YEAR=2010 
+0

Donc, juste une question .. cette requête va être appelée plusieurs fois .. fait une jointure pas plus lente par rapport aux sous-requêtes? – Vishal

+0

La table des classements ne contient pas non plus de colonne de date. Vous ne pouvez donc pas vous y joindre. – Vishal

+0

@misnomer. Belle prise j'ai mis à jour la jointure –

0

Voici une solution qui utilise la clause BETWEEEN.

UPDATE Leaderboards_Table 
SET Points=tt.Points, Score = tt1.Score 
FROM LeaderBoards_Table 
JOIN Test_Table1 tt1 ON LeaderBoards_Table.EmployeeId = tt1.EmployeeId 
JOIN Test_Table tt ON tt1.EmployeeId = tt.EmployeeId 
WHERE EmployeeId = @EmployeeId 
    AND CONVERT(datetime CAST(YEAR AS varchar) + CAST(MONTH AS varchar) + CAST(DAY AS varchar)) 
      BETWEEN '20101209' AND '20101210'