抱歉,这是我第一次使用这个论坛。显然人们可以编辑我的帖子虽然有用,但已经取出了一些信息。 我会尽量让它更容易理解。
我使用SQL Compact 3.5作为本地数据库。 该程序是用VB.NET编写的。
问题在于查询我的一张桌子花了太长时间。
除其他外,播放器表格包含id
,skill
,school
,weight
,starter
。
id
是玩家的身份skill
是玩家的技能等级school
是指向学校表id的外键weight
是14个不同数字之一我要做的是为给定学校给定体重的技能最高的玩家设置starter
value ='true'。
因此,如果一所学校有100名球员,那么将有14名首发球员,每名球员一名。
玩家桌面有170,000名玩家,每个玩家拥有14种不同的权重,每个玩家都属于4500所学校中的一所。
有人在下面发表评论,并表明这一陈述似乎在正确的轨道上。我是新手,还没有实现它。
"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 :(得分:3)
此更新查询不是一行一行地逐行进行,而是一次完成所有操作:
首先,它为每个skill
/ school
组合收集最高weight
。
然后将其加入到具有匹配的player
/ school
/ weight
组合的skill
,然后将player
设置为启动器。
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 :(得分: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
为真):