2010-12-10 13 views
1

さてさて、私は私より簡略化と同様のテーブル構造を作成する必要があります -今日のデータと昨日のデータを取得して更新するSQLクエリ?

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

今、私のようなもの更新またはLeaderBoards_Tableに挿入する単一のクエリを記述する必要がある -

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 

を今すぐ上記のクエリは今日のアップデートのみです...私がやりたいことは昨日もアップデートしています もう1つのクエリを書いてはいけません....とにかく昨日と今日のポイントを更新するために。

UPDATE:このクエリも多くの時間と呼ばれます。このため、このクエリは最も効果的なクエリです。

答えて

1

サブクエリーの代わりにジョインに変更すると非常に簡単です。

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

この質問はサブクエリに比べて遅くならないので、ちょっと質問があります。 – Vishal

+0

また、leaderboardsテーブルには日付カラムがありません。それには参加できません。 – Vishal

+0

@misnomer。ニースキャッチ私は結合を更新しました –

0

これは、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' 
関連する問題