2010-12-10 179 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 

現在以上查詢只是今天的更新...我想要做的也是昨天更新 也在一個單一的查詢我不想寫另一個查詢....所以有無論如何做一個查詢來更新昨天和今天的點。

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 2010-12-10 18:14:09

+0

另外排行榜表中沒有日期欄..所以不能加入.. – Vishal 2010-12-10 18:24:33

+0

@misnomer。很好,我已經更新了連接 – 2010-12-10 19:31:47

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'