需要修改此查询

需要修改此查询

问题描述:

我有一个查询,我认为是按照预期工作,直到不久之前。需要修改此查询

下面的查询通过我的'玩家'表,并更新'starter'值为true,对于那些拥有最高技能的玩家,他们的体重在该学校

例如,如果有500名玩家的重量为X,它将选择属于同一所学校的所有玩家,而那些玩家将会将“起始者”值更新为真技能。

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名球员,也有相同的技能,那么都有他们的“启动器”值设置为true。

所以我的问题是,我需要添加到这个查询,只允许一个初学者在一个特定学校的体重?

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

+0

如果他们有相同的年龄? – 2012-04-23 07:48:02

+0

好点..我认为运行一个额外的查询可能是最好的,以查看每个学校的首发总人数是否大于总权数,然后可能找到受影响的区域并对其进行编辑 – Meowbits 2012-04-23 22:17:25

+0

@Meowbits:I不要以为这就是阿米特试图说的,这应该是完全可能在一个单一的查询。 – 2012-04-24 06:30:14

你将不得不改变你的查询,因此,只有那些行被更新,它具有更大的skillage没有其他行这个school/weight

我另外的情况下,加入了独特的列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) 
    ) 
+0

试过这些,他们没有工作。不过谢谢。 – Meowbits 2012-04-23 21:41:25

+0

什么都不起作用?你有错误还是错误的结果? – 2012-04-24 06:28:02

+0

对不起,一直很忙。通过使用这两条附加线,我获得了比以前更多的“真实”值。 – Meowbits 2012-04-25 04:57:43

我不知道技能是如何计算这个已经写了一个替代选择,你可以加入到它,并相应地更新行。还创建了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 
+0

欣赏努力,但我认为你的代码现在略高于我。 – Meowbits 2012-04-23 21:43:34