2012-04-23 149 views
1

我有一個查詢,我認爲是按照預期工作,直到不久之前。需要修改此查詢

下面的查詢通過我的'玩家'表,並更新'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

回答

3

你將不得不改變你的查詢,因此,只有那些行被更新,它具有更大的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

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 
+0

欣賞努力,但我認爲你的代碼現在略高於我。 – Meowbits 2012-04-23 21:43:34