1

wechseln habe ich einen Tabellennamen [NavBar] mit diesen Spalten:Wie zwischen zwei Werten der gleichzeitigen Tabellenzeilen in SQL

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

Beispieldaten:

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

Wie führe ich die Aktualisierung wechseln zwischen zwei Zeilen DisplayOrder von two concurrent rows (Bestellung von Displayorder)?

Zum Beispiel Contact = 4, Career = 3

Erwartete Leistung:

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

Eingangsparameter: Id einer Zeile nur

Antwort

1

Wenn Sie aktualisieren id = 102 (und dann 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; 

AUSGANG

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

@BimalDas Warum? Es funktioniert gut. Sie sollten Ihr 'mit' mit Semikolon – vercelli

+1

@BimalDas starten, wenn Sie versuchen, die letzte Zeile zu aktualisieren, was sollte passieren? – vercelli

+0

Ich werde vielleicht vom Code einschränken? Ja, es gibt ein Problem. –

0

ich denke, es

funktionieren sollte
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