Van két olyan táblázatom, amelyet így terveztem, az elemek esetleges átrendezését szem előtt tartva:
1. [dbo.test_db_002] with columns:
[id] = INT NOT NULL IDENTITY(1,1) PRIMARY KEY
[name] = NVARCHAR(255)
és
2. [dbo.test_db_003] with columns:
[ord] = INT
[itmid] = INT NOT NULL PRIMARY KEY
Az [itmid] oszlopban van egy megszorítás, amely összekapcsolja a [dbo.test_db_002].[id]-vel, például:
ALTER TABLE [dbo.test_db_003]
ADD CONSTRAINT fk1 FOREIGN KEY ([itmid])
REFERENCES [dbo.test_db_002]([id])
ON DELETE CASCADE ON UPDATE CASCADE;
Tegyük fel, hogy a [dbo.test_db_002] tábla a következő adatokat tartalmazza:
[id] [name]
3 John
5 Mary
8 Michael
10 Steve
13 Jack
20 Pete
és a [dbo.test_db_003] a következő rendelési adatokkal rendelkezik:
[ord] [itmid]
1 5
4 8
5 13
8 3
10 10
13 20
Tehát amikor lekérek neveket az adatbázisból, a következő SQL-t használom:
SELECT [name]
FROM [dbo.test_db_002] t1
LEFT JOIN [dbo.test_db_003] t2 ON t1.[id]=t2.[itmid]
ORDER BY t2.[ord] ASC
Elõállítja a névlistát (a [dbo.test_db_003].[ord] oszlop szerint rendezve):
Mary
Michael
Jack
John
Steve
Pete
Amit keresek, az az a lehetőség, hogy az egyes neveket felfelé és lefelé mozgassam a listában. Például, ha el akarom mozdítani "Jánost" egy pozícióval feljebb, mit tegyek?
Eddig ezt a részleges SQL-t találtam ki:
WITH cte AS
(
SELECT [id], [ord], ROW_NUMBER() OVER (ORDER BY t2.[ord] ASC) AS rowNum
FROM [dbo.test_db_002] t1
LEFT JOIN [dbo.test_db_003] t2 ON t1.[id] = t2.[itmid]
)
Ez a következőket választja ki:
rowNum [id] [ord]
1 1 5
2 4 8
3 5 13
4 8 3
5 10 10
6 13 20
Szóval megértem, hogy az [ord] oszlop értékeit eggyel feljebb kell tolnom a 3-as indextől kezdve (mivel a "János" indexe 4), majd valahogy a "János" [ord]-ét 5-re kell állítanom, de hogyan csinálod, hogy?