Permalänk
Medlem

SQL-sortering - Förvirrande!

Hej!

Jag har en tabell som jag sorterar valdaKurser för fiktivastudenter. de valda kurserna har ett fält Prio, för prioritering.
Problemet uppstår när jag ska ta bort en rad så blir prioriteringen inte kontinuerlig, utan det uppstår ett gap.

Jag har försök skriva ihop en SQL-sats som dels är plockad ifrån internet. Som ska ta bort det här gapet och numrera om prio fältet.

with renumber as ( select pnr, row_number() over (order by Prio desc, pnr) as rn from [dbo].Valdakurser where pnr='123329' ) update [dbo].Valdakurser set Prio = r.rn from renumber r where [dbo].Valdakurser.pnr = r.pnr and Prio <> r.rn;

Problemet eller förvirring är att när jag kör den här SQL-satsen ovan så blir prio ordningen helt slumpmässig känns det som!

Om jag bara kör:

select pnr, row_number() over (order by Prio desc, pnr) as rn from [dbo].Valdakurser where pnr='123329'

Så får jag ut rn (rownumber) korrekt, alltså 1-2-3-4-5-6.

Någon som har en aning om vad som kan stå på? Eller har förslag på en annan lösning.
Jag vill tillägga att prio är inte ett unikt fält eftersom att det finns fler användare med olika personnummer.

Visa signatur

~. Citera så jag hittar tillbaka .~

Permalänk
Medlem

Ingen som har ett hum om SQL?

Att loopa SQL frågorna i C# verkar otroligt ineffektivt!

Visa signatur

~. Citera så jag hittar tillbaka .~

Permalänk
Medlem

En lite update:

Jag har lyckats ordna så att raderna uppdateras rätt, tyvärr inte i hänsyn till den gamla prioriteringen.

Declare @a int; SET @a=0; UPDATE [dbo].Valdakurser SET Prio=@a, @a=@a+1 WHERE pnr='123329';

Visa signatur

~. Citera så jag hittar tillbaka .~

Permalänk
Medlem

din uppdatering tar ingen hänsyn till vilken kurs den uppdaterar.

förslag:

WITH renumber AS ( SELECT pnr, valdkurs, Row_Number() OVER (ORDER BY Prio, pnr) AS rn FROM Valdakurser WHERE pnr = '123456' ) UPDATE v SET Prio = r.rn FROM Valdakurser v INNER JOIN renumber r ON r.pnr = v.pnr AND r.valdkurs = v.valdkurs WHERE v.pnr = '123456';

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Medlem

Kan du inte göra det enkelt för dig? Vid borttagning av en kurs ser du samtidigt till att dra av 1 från personens samtliga kursers prio som låg efter det borttagna kursen?

Permalänk
Medlem
Skrivet av jovnas:

din uppdatering tar ingen hänsyn till vilken kurs den uppdaterar.

förslag:

WITH renumber AS ( SELECT pnr, valdkurs, Row_Number() OVER (ORDER BY Prio, pnr) AS rn FROM Valdakurser WHERE pnr = '123456' ) UPDATE v SET Prio = r.rn FROM Valdakurser v INNER JOIN renumber r ON r.pnr = v.pnr AND r.valdkurs = v.valdkurs WHERE v.pnr = '123456';

Jag ska prova din kod.

Jag håller på med en kod som fungerar i MSSQL, men som inte fungerar i C# p.g.a @-tecknet. C# tror att det är en parameter fast det i själva verket är en variable i SQL.

Declare @a int; SET @a=0; UPDATE [dbo].Valdakurser SET Prio=@a, @a=@a+1 FROM [dbo].Valdakurser t1 JOIN (SELECT TOP 1000 pnr FROM [dbo].Valdakurser ORDER BY Prio)t2 ON t1.pnr='123329';

Skrivet av head:

Kan du inte göra det enkelt för dig? Vid borttagning av en kurs ser du samtidigt till att dra av 1 från personens samtliga kursers prio som låg efter det borttagna kursen?

Som jag redan nämnt så känns det oerhört ineffektivt att behöva loopa igenom och skicka en fråga för varje rad - man måste kunna skicka en enda fråga till SQL server så utför den det.

Visa signatur

~. Citera så jag hittar tillbaka .~

Permalänk
Medlem
Skrivet av jovnas:

din uppdatering tar ingen hänsyn till vilken kurs den uppdaterar.

förslag:

WITH renumber AS ( SELECT pnr, valdkurs, Row_Number() OVER (ORDER BY Prio, pnr) AS rn FROM Valdakurser WHERE pnr = '123456' ) UPDATE v SET Prio = r.rn FROM Valdakurser v INNER JOIN renumber r ON r.pnr = v.pnr AND r.valdkurs = v.valdkurs WHERE v.pnr = '123456';

Provade nyss din SQL-sats och den fungerar - Tack så jätte mycket!

Visa signatur

~. Citera så jag hittar tillbaka .~