2012-04-23 24 views
1

少し前まで意図したとおりに動作していると思っていたクエリがあります。このクエリを変更する必要があります

次のクエリは、私の 'player'テーブルを通過して、その学校の体重が最高の才能を持つすべてのプレイヤーの値をのに更新します。

例えば、体重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 

私は今に走った問題も同じスキルを持っている同じ重量で同じ学校からの2人の選手、存在する場合、両方の彼らの「スターター」値がtrueに設定されていることです。

私の質問は、特定の学校のウェイトで1つのスターターだけを許可するには、このクエリーに何を追加する必要がありますか?

また、「年齢」という名前の列があります。できる場合は、同じスキルが発生する2つの年齢を選択したいと考えています。

+0

同じ年齢の場合はどうなりますか? –

+0

良い点..合計スターターが各学校の合計ウェイトよりも大きいかどうかを確認するために追加のクエリを実行し、影響を受けるエリアを見つけて編集することが最もよいと思われます。 – Meowbits

+0

@Meowbits:私これはAmitが言ったことではないと考えています。これは1つのクエリで完全に可能でなければなりません。 –

答えて

3

行のみが更新されるようにするには、より大きなskillまたはage下でこれschool/weightのために、他の行を持っていないこれは、あなたのクエリを変更する必要があります。

同じskillと同じageの行がある場合は、さらに固有の列idを追加します。

私はスキルが交換を書かれている。このために計算されているのか分からない

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

+0

正確には機能しませんでしたか?間違いや間違った結果を得ましたか? –

+0

申し訳ありません、ビジー状態です。私はこれらの追加の線の両方を使って以前よりももっと多くの「真の」値を得ています。 – Meowbits

0

によって

AND b.skill > player.skill 

を交換し、あなたがそれに参加し、それに応じて行を更新する可能性が選択します。 9行のサンプルデータを作成しました。最後の2つのHと私は同じスキルと学校を持っていますが、年齢が違っています(1日分)。生年月日があると仮定すると、最大/最小が機能します。あなたは同じ年齢の選手を持つことができるので、それに対処する仕組みが必要です。基準を確認していないので、ここで食事を提供できません。

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

関連する問題