"Thïngmand" wrote:
>
> Jeg har en tabel der kunne se sådan ud:
>
> ranking navn point
> 1 Ole 189
> 2 Lene 164
> 3 Hans 159
> 4 Jette 97
> 5 Thomas 23
>
> Hans har nu fået 10 point mere og skal derfor en ranking op (altså bytte
> plads med Lene)
>
> Den eneste løsning jeg er kommet frem til, er at
>
> 1. give Hans et midertidigt ranking (eks. 000) og derefter
>
> 2. give Lene ranking=ranking+1 og så
>
> 3. ændre Hans's ranking til gl.ranking-1
Virker ikke. Hvad hvis Hans' ranking skal ændres med mere end én?
> Problemet er at det kræver 3 forespørgsler - nogle der har nogle bedre
> forslag der kan klares på færre forespørgsler?
Mindre end to opdateringer kan ikke gøre det, og som du ser, benytter
jeg en del subselects. Til gengæld er det hermed ligemeget, hvor mange
pladser Hans springer op i placeringen.
update T T2
set point = point + 10
, ranking = (select max(ranking) from T T1 where T1.point < T2.point +
10)
where navn = 'Hans'
update T
set ranking = ranking + 1
where point between (select point from T where navn = 'Hans') - 10
and (select point from T where navn = 'Hans')
Og så kræver løsningen naturligvis, at ranking ikke er unique, men
hvorfor skulle den også være det? Du ændrer vel ikke i din primærnøgle?
--
Kristian Damm Jensen | Feed the hungry. Go to
kristian-damm.jensen@capgemini.dk |
http://www.thehungersite.com