1

J'ai un nom de table [NavBar] avec ces colonnes:Comment basculer entre deux valeurs de lignes de la table dans Sql

Id [int] 
Name [nvarchar] 
DisplayOrder [int] 

données de l'échantillon:

Id Name DisplayOrder 
--------------------------- 
1 Home  1 
2 Products 2 
3 Contact  3 
4 Career  4 

Je veux écrire une requête de mise à jour DisplayOrder entre deux lignes dont displayOrder est la valeur d'ordre d'affichage la plus élevée d'une ligne donnée.

Par exemple Contact = 4, Career = 3

Sortie prévue:

1 Home  1 
2 Products 2 
3 Contact 4 
4 Career 3 

Comment puis-je effectuer une opération mise à jour pour basculer entre les deux rangées ordre d'affichage de deux lignes simultanées (par ordre de displayorder)?

paramètre d'entrée: Id d'une ligne seulement

+0

paramètre d'entrée doit être l'ID de la ligne et la position que vous voulez montrer à, non? – Danieboy

+0

Je veux dire Si le paramètre d'entrée Id = 3 (contact) alors je veux basculer avec la prochaine ligne displayorder (c'est-à-dire la carrière i.e 4) –

+0

Que voulez-vous dire par "paramètre d'entrée: Id d'une seule ligne" ?? –

Répondre

1

Vous devez obtenir le Displayorder de votre entrée, et de votre prochain enregistrement
Que vous pouvez mettre à jour tout cela. C'est un peu compliqué mais je l'ai testé ça fonctionne.
De cette manière, vous pouvez éviter les problèmes lorsque DisplayOrder comporte des espaces vides.

declare @InputID int = 3 
declare @DisplayOrderInput int 
declare @ID int 
declare @DisplayOrder int 

select @DisplayOrderInput = DisplayOrder from NavBar where ID = @InputID 

select top 1 
     @ID = ID, 
     @DisplayOrder = DisplayOrder 
from NavBar 
where DisplayOrder > (select DisplayOrder from NavBar where ID = @InputID) 
order by DisplayOrder 

update NavBar set DisplayOrder = @DisplayOrder where ID = @InputID 
update NavBar set DisplayOrder = @DisplayOrderInput where ID = @ID 

select * from NavBar 
1

Essayez quelque chose comme ceci:

UPDATE NavBar 
SET  DisplayOrder = CASE 
         WHEN DisplayName = @row1 THEN (select DipslayOrder from NavBar where DisplayName = @row2) 
         WHEN DisplayName = @row2 THEN (select DipslayOrder from NavBar where DisplayName = @row1) 
         END 
WHERE DisplayName IN (@row1, @row2); 

espère que cela fonctionne pour vous.

+0

comment j'exécute cette requête? Quelles sont les valeurs de @ row1, @ row2 ou DidplayName? –

1
Try with this.. For any id it will work : 

DECLARE @INPUT INT=3 

UPDATE A 
SET A.DISPLAYORDER = B.DISPLAYORDER 
FROM #TEMP A 
     INNER JOIN (SELECT ID, 
          NAME, 
          CASE 
          WHEN ID = @INPUT THEN DISPLAYORDER + 1 
          WHEN ID = @INPUT + 1 THEN DISPLAYORDER - 1 
          ELSE DISPLAYORDER 
          END DISPLAYORDER 
        FROM #TEMP)B 
       ON A.ID = B.ID  


    Output : 

    ID NAME DISPLAYORDER 
    1 Home  1 
    2 Products 2 
    3 Contact  4 
    4 Career  3 
1

Essayez this-

-- 1) Get Current row's displayorder and Next Row's id in Temp table 
SELECT nb1.DisplayOrder, nb2.id 
into #TempNavBar 
FROM [NavBar] nb1 
INNER JOIN [NavBar] nb2 ON nb1.id = nb2.id - 1 
WHERE nb1.Id = 3 

-- 2) Update Actual table by using Self join on Next row 
UPDATE nb1 
    SET nb1.DisplayOrder = nb2.DisplayOrder 
FROM [NavBar] AS nb1 
INNER JOIN [NavBar] AS nb2 ON nb1.id = nb2.id - 1 
WHERE nb1.Id = 3 

-- 3). Update Actual table by joining it with temp table 
UPDATE nb1 
    SET nb1.DisplayOrder = tmp2.DisplayOrder 
FROM [NavBar] AS nb1 
INNER JOIN #TempNavBar AS tmp2 ON nb1.id = tmp2.id 

-- Cleanup operation 
DROP TABLE #TempNavBar 

Ce que je l'ai fait ici est de rejoindre la table NavBar avec lui-même, mais sur ID de ligne suivante quérir la colonne de ligne courante DisplayOrder et id la valeur de la colonne de la ligne suivante et insérez-le dans la table temporaire.

Dans la deuxième requête, j'ai mis à jour la valeur de la ligne displayOrder de la ligne courante avec la valeur de sa prochaine ligne.

Dans la troisième requête, j'ai mis à jour la valeur displayOrder avec la valeur de la table temporaire DisplayOrder en joignant la table [NavBar] avec la table temporaire.

Résultat

Id Name DisplayOrder 
------------------------ 
1 Home  1 
2 Products 2 
3 Contact  4 
4 Career  3