1

J'ai un nom de table [NavBar] avec ces colonnes:Comment basculer entre les deux valeurs de lignes de table simultanées dans SQL

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

données Exemple:

Id Name DisplayOrder 
--------------------------- 
100 Home  1 
101 Products 2 
102 Contact  3 
103 Career  4 

Comment puis-je effectuer une opération de mise à jour pour basculer entre deux rangées DisplayOrder de two concurrent rows (commande par Displayorder)?

Par exemple Contact = 4, Career = 3

Sortie prévue:

100 Home  1 
101 Products 2 
102 Contact 4 
103 Career 3 

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

Répondre

1

Si vous mettez à jour id = 102 (et 103)

drop table navBar; 
create table navBar 
(Id [int], 
Name [nvarchar] (200), 
DisplayOrder [int]); 

insert into navBar 
values 
(100, 'Home'  , 1), 
(101, 'Products', 2), 
(102 , 'Contact',  3), 
(103 , 'Career',  4); 

declare @id int; 

set @id = 102 

; with t as(
select id, name, DisplayOrder, 
     lag(id) over(order by DisplayOrder) lgid, 
     lag(DisplayOrder) over(order by DisplayOrder) lgDisplayOrder, 
     lead(DisplayOrder) over(order by DisplayOrder) ldDisplayOrder 
from navBar) 
update t 
    set DisplayOrder = case @id when id then ldDisplayOrder else lgDisplayOrder end 
where (@id = id and ldDisplayOrder is not null) 
    or (@id = lgid); 


select * from navBar; 

SORTIE

Id Name DisplayOrder 
100 Home 1 
101 Products 2 
102 Contact 4 
103 Career 3 
+0

@BimalDas Pourquoi? Ça fonctionne bien. Vous devriez commencer votre 'avec 'avec le point-virgule – vercelli

+1

@BimalDas si vous essayez de mettre à jour la dernière ligne, que devrait-il se passer? – vercelli

+0

Je vais restreindre du code peut-être? ya il y a un problème. –

0

Je pense que cela devrait fonctionner

declare @Id int = 101 

update t1 
set Id = new_ID + @Id 
from NavBar t1 
inner join (select DisplayOrder, row_number() over (order by DisplayOrder) as new_ID 
      from NavBar where Id > @Id) as t2 on t2.DisplayOrder = t1.DisplayOrder