2012-03-23 46 views
1

對不起,這是我第一次使用這個論壇。顯然人們可以編輯我的帖子,雖然有幫助,已經採取了一些信息。 我會盡量讓它更容易理解。如何提高此SQL更新查詢的速度?

我正在使用SQL Compact 3.5作爲本地數據庫。該程序是用VB.NET編寫的。

問題是查詢我的一個表耗時過長。

播放器表有,除其他事項外,idskillschoolweightstarter

  • id是玩家的ID
  • skill是玩家的技能等級
  • school是一個外鍵指向校表的ID
  • weight是14個不同的數字
之一

我想要做的是設置starter value ='true',對於在給定的重量下技能最高的玩家ht給某所學校。 因此,如果一所學校有100名選手,則會有14名初學者,每名選手一名。

玩家桌上有170,000名玩家,每個玩家有14個不同的權重中的1個,每個玩家都屬於4500所學校中的1個。

有人在下面發表了看法,並表明這種說法似乎是正確的。我是新手,還沒有得到它的實施。

"UPDATE p " & 
    "SET starter = 'TRUE' " & 
    "FROM player p" & 
    "JOIN (" & 
    "SELECT DISTINCT school, weight, MAX(skill) AS MaxSkill " & 
    "FROM player " & 
    "GROUP BY school, weight" & 
    ") q ON q.school = p.school AND q.weight = p.weight AND q.MaxSkill = 
    p.skill" 
+0

重量範圍還是數字?也就是說應該只將權重14與其他14或與13-15分組? – 2012-03-23 23:12:28

+0

簡單的答案 - 一次不要做一次學校/體重。 – Bridge 2012-03-23 23:16:27

+0

顯示你想要輸出的例子,你的問題不是很清楚。 – Sparky 2012-03-23 23:17:02

回答

3

而不是做一組,由組,一行接一行的做法,這種更新查詢,所有這一切在一次:

首先,它會收集每個school/weight組合最高skill

然後,它連接該到具有匹配school/weight/skill組合,然後設置playerplayer即到起動器。

UPDATE p 
SET starter = 'TRUE' 
FROM player p 
JOIN (
    SELECT school, weight, MAX(skill) AS MaxSkill 
    FROM player 
    GROUP BY school, weight 
) maxResults 
    ON maxResults.school = p.school 
    AND maxResults.weight = p.weight 
    AND maxResults.MaxSkill = p.skill 

然而,在技能平局的情況下,與最高技能的所有玩家將被設置爲首發......

1

有過使用weight一些小的混亂,因爲我假設你不是以單位爲單位做這件事的。您可能想要將範圍提取到另一個表格,然後使用該ID代替數字權重。

在任何情況下,這裏有一個查詢,應爲所有RDBMS

UPDATE player a SET starter = TRUE 
WHERE NOT EXISTS (SELECT '1' 
        FROM player b 
        WHERE b.school = a.school 
        AND b.weight = a.weight 
        AND b.skill > a.skill) 

內查詢應返回null工作(從而設置starter真),如果:

  1. 沒有其他球員在學校
  2. 同一學校沒有玩家在相同的體重等級
  3. 有沒有球員w ith更高的技能水平,對於同一所學校和體重類別
+0

+1對於更多的數據庫不可知論比我的答案。 – 2012-03-23 23:33:44

+0

嘗試設置更新內部的別名時出現錯誤。我如何爲SQL compact server 3.5執行此操作?我發現了一個類似的問題,但我無法解決這個問題。 http://stackoverflow.com/questions/4981481/how-to-write-update-sql-with-table-alias-in-sql-server-2008 – Meowbits 2012-03-24 00:37:15

+0

@Meowbits - 你需要刪除'as',這顯然不是不可知的 – 2012-03-26 16:05:28