需要修改此查询

时间:2012-04-23 07:41:27

标签: sql sql-server-ce

我有一个查询,我认为这个问题直到很久以前才按预期进行。

以下查询通过我的“玩家”表格,并为每位在该学校重量级技能最高的玩家更新'启动'值为true。

例如,如果有权重为X的500名玩家,它将选择属于同一所学校的所有玩家,并且对于具有最高技能的玩家,它会将'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

我现在遇到的问题是,如果同一个学校有两名同一体重的球员,也具有相同的技能,那么他们的'首发'值都设为真。

所以我的问题是,我需要在此查询中添加哪些内容,以便只为特定学校提供一个权重的启动器?

我还有一个名为'age'的专栏,如果可以的话,我想选择相同技能发生的两个较低的年龄。

2 个答案:

答案 0 :(得分:3)

您必须更改您的查询,以便只更新这些行,这些行没有其他行,school / weight更高skill lower 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 )
    )

答案 1 :(得分: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