WebHU - Programozási kérdések és válaszok

SQL a sorok felfelé vagy lefelé mozgatásához kéttáblás elrendezésben

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?

12.11.2011

  • Mi lesz az a folyamat, amellyel egy név felfelé vagy lefelé kerül a listán? Frissül a rendelési táblázat, vagy más művelet váltja ki a változást? 12.11.2011
  • Igen, elő kell állnom az UPDATE utasítással a rendelési táblázat frissítéséhez, azaz a [dbo.test_db_003].[ord] oszlophoz. A felfelé vagy lefelé lépés is lehet csak egy lépés, vagyis nem lehet 2 vagy több pozíciót elmozdítani... 12.11.2011

Válaszok:


1

Készítettem egy teljes bemutatót, hogyan dolgozzon a data.stackexchange.com oldalon.
A megoldás az Ön megjegyzéséhez van szabva:

a felfelé vagy lefelé lépés csak egyetlen lépésből állhat – vagyis nem lehet 2 vagy több pozíciót elmozdítani

A példában arra késztetem Johnt, hogy sorszámú pozíciót cseréljen Jackkel felette:

WITH x AS (
  SELECT t2.itmid, t2.ord
  FROM   dbo.test_db_002 t1
  LEFT   JOIN dbo.test_db_003 t2 ON (t1.id = t2.itmid)
  WHERE  t1.name = 'John'  -- must be unique, or query by id ...
  )
  , y AS (
  SELECT TOP 1
         t.itmid, t.ord
  FROM   dbo.test_db_003 t, x
  WHERE  t.ord < x.ord     -- smaller ord = "above"
  ORDER  BY t.ord DESC
  )
UPDATE dbo.test_db_003 SET ord = z.ord
FROM (
   SELECT x.itmid, y.ord FROM x,y
   UNION ALL
   SELECT y.itmid, x.ord FROM x,y
   ) z
WHERE  dbo.test_db_003.itmid = z.itmid   

###Főbb pontok:

  1. Használjon két CTE-t a lekérdezés felépítéséhez:
  2. Szerezze meg John azonosítóját és sorszámát
  3. Ugyanezt szerezze be a felette állónak
  4. Készítsen két sort, ahol ez a két sorszámot vált a UNION ALL segítségével
  5. Használja ezt a két sort egy most egyszerű UPDATE
  • A ord sorszámú pozíciónak lehetővé kell tennie a duplikátumok átadását, hogy ez működjön.
  • Ha nincs „fölött” senki, a lekérdezés csendben nem csinál semmit.
12.11.2011
  • Wow, köszönöm szépen! Hadd tanulmányozzam, és megjelölöm válaszként. Király vagy! Nagyra értékelem az idejét. 12.11.2011
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..