Wie

1

zwischen zwei Werten von Tabellenzeilen in Sql Toggle habe ich einen Tabellennamen [NavBar] mit diesen Spalten:Wie

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

Beispieldaten:

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

Ich möchte eine Abfrage schreiben DisplayOrder zu aktualisieren zwischen zwei Zeilen, deren displayOrder der nächsthöhere ist, zeigt den Bestellwert einer gegebenen Zeile an.

Zum Beispiel Contact = 4, Career = 3

Erwartete Ausgabe:

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

Wie führe ich Update-Operation, um zwischen zwei Reihen um zwei gleichzeitige Reihen (Reihenfolge von Displayorder) angezeigt werden?

Eingangsparameter: Id einer Zeile nur

+0

Eingangsparameter sollte die ID der Zeile sein und die Position Sie es zeigen wollen, nicht wahr? – Danieboy

+0

Ich meine Wenn Eingabeparameter Id = 3 (d. H. Kontakt) dann möchte ich mit der nächsten Anzeigereihenfolge wechseln (d. H. Karriere, d. H. 4) –

+0

Was meinen Sie mit "Eingabeparameter: Id nur einer Zeile" ?? –

Antwort

1

Sie müssen den Displayorder von Ihrer Eingabe erhalten, und von Ihrem nächsten Datensatz
Dann können Sie alles aktualisieren. Es ist ein bisschen kompliziert, aber ich habe es getestet, es funktioniert.
Auch so können Sie Probleme vermeiden, wenn der DisplayOrder Lücken aufweist.

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

so etwas wie dieses Versuchen:

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); 

Hope this für Sie arbeitet.

+0

Wie führe ich diese Abfrage aus? Was sind die Werte von @ row1, @ row2 oder 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

Versuchen 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 

, was ich hier getan ist registrieren um den NavBar Tabelle mit sich selbst, sondern bei der nächsten R. id und holen die DisplayOrder Spalte aktuelle Zeile und id Spalte Wert der nächsten Zeile und fügen Sie es in die temporäre Tabelle ein.

In der zweiten Abfrage habe ich den Wert der displayOrder Wert der aktuellen Zeile mit der nächsten Zeile Wert aktualisieren.

In der dritten Abfrage habe ich den displayOrder Wert mit der Temp-Tabelle DisplayOrder Wert aktualisieren, indem Sie die [NavBar] -Tabelle mit Temp-Tabelle verbinden.

Ergebnis

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