1

我有一个查询,直到不久前我认为它正在按预期工作。

以下查询遍历我的“玩家”表,并将该学校中具有最高技能的每个玩家的“起始者”值更新为真。

例如,如果有 500 名体重为 X 的玩家,它将选择所有属于同一学校的玩家,并且对于那些技能最高的玩家,它会将“starter”值更新为 true。

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

我现在遇到的问题是,如果有 2 名来自同一学校、体重相同、技能相同的球员,那么他们的“starter”值都设置为 true。

所以我的问题是,我需要在这个查询中添加什么才能只允许一个特定学校的重量级初学者?

我还有一个名为“年龄”的列,如果可以的话,我想选择出现相同技能的两者中较低的年龄。

4

2 回答 2

3

您将不得不更改您的查询,以便只更新那些行,这些行没有其他行用于此school/weight具有更大skill 更低的age

id如果您有相同skill和相同的行,我还会添加一个唯一列age

代替

AND b.skill > player.skill

经过

AND (    ( b.skill > player.skill )
      OR ( b.skill = player.skill AND b.age < player.age )
      OR ( b.skill = player.skill AND b.age = player.age AND b.id > player.id )
    )
于 2012-04-23T07:48:32.110 回答
0

我不知道如何为此计算技能已经写了一个替换选择你可以加入它并相应地更新行。还创建了一些 9 行的示例数据;最后两个 H 和我有相同的技能和学校,但不同的年龄(一天)。假设你有出生日期,最大值/最小值将起作用。您仍然可以拥有相同年龄的球员,因此需要有一个机制来处理这个问题。不确定标准,所以这里不适合。

declare @players table (school varchar(100), weight float, skill int, dob datetime, name varchar(100))

insert into @players
select 'a', 100, 10, GETDATE(), 'a'
union all select 'a', 101, 11, GETDATE(), 'b'
union all select 'a', 102, 12, GETDATE(), 'c'
union all select 'a', 103, 13, GETDATE(), 'd'
union all select 'a', 104, 14, GETDATE(), 'e'
union all select 'a', 105, 15, GETDATE(), 'f'
union all select 'a', 106, 16, GETDATE(), 'g'
union all select 'a', 107, 17, GETDATE(), 'h'
union all select 'a', 107, 17, dateadd(dd,-1,GETDATE()), 'i'

select * from @players
SELECT 
        school, 
        weight, 
        max(skill) as Skill,
        MIN(dot) as DOB
FROM @players b 
group by school, weight

这返回;8 排并选择 107 名体重类​​别的球员中较年轻的。

school  weight  (No column name)    (No column name)
a   100 10  2012-04-23 08:53:19.877
a   101 11  2012-04-23 08:53:19.877
a   102 12  2012-04-23 08:53:19.877
a   103 13  2012-04-23 08:53:19.877
a   104 14  2012-04-23 08:53:19.877
a   105 15  2012-04-23 08:53:19.877
a   106 16  2012-04-23 08:53:19.877
a   107 17  2012-04-22 08:53:19.877
于 2012-04-23T07:57:19.430 回答