2012-03-23 50 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