Auswählen der vorherigen und nächsten Zeile mit sp

Ich möchte die vorherige und nächste Zeile aus der Tabelle auf der Grundlage der aktuellen ID auswählen. Ich sende die aktuelle ID zur gespeicherten Prozedur und verwende diese Abfrage:

-- previous select top 1 id from table where id < @currentId order by id desc -- next select top 1 id from table where id < @currentId order by id asc 

Das Problem ist, wenn ich currentId sendet, welches die letzte ID in der Tabelle ist und die nächste Zeile auswählen will. Dann ist nichts ausgewählt. Gleiches Problem für die vorherige Zeile, wenn ich currentId sendet, welches die erste ID in der Tabelle ist

Ist es möglich, dies in sql ohne zusätzliche fragen zu lösen?

Bearbeiten – nur realisiert Sie wollen immer zwei Reihen zurückgegeben werden, re-working …

Aktualisierter Code:

 SELECT * FROM @t WHERE ID = ( select top 1 id from @t where id < case when exists (select id from @t where id < @ID) then @ID else (@ID + 1) end order by id desc ) UNION SELECT * FROM @t WHERE ID = ( select top 1 id from @t where id > case when exists (select id from @t where id > @ID) then @ID else (@ID - 1) end order by id ) 

Original Post unten, bevor ich merkte, was genau Sie wollten

Du warst ganz nah, du brauchst den UNION Operator und eine kleine Syntaxänderung zu deiner Abfrage.

 SELECT * FROM [table] WHERE ID = (select top 1 id from @t where id < @ID order by id desc) UNION SELECT * FROM [table] WHERE ID = (select top 1 id from @t where id > @ID order by id) 

Dies wird 1 Zeile zurückgeben, wenn die ID, die Sie übergeben, die erste Zeile oder letzte Zeile ist, 2 Zeilen ansonsten.

Testcode:

 DECLARE @t TABLE ( Id int identity, Col varchar(200) ) INSERT INTO @t VALUES('column one') INSERT INTO @t VALUES('column two') INSERT INTO @t VALUES('column three') INSERT INTO @t VALUES('column four') INSERT INTO @t VALUES('column five') DELETE FROM @t WHERE ID = 3 DECLARE @Id int SET @Id = 3 -- Change this to other values to further test SELECT * FROM @t WHERE ID = (select top 1 id from @t where id < @ID order by id desc) UNION SELECT * FROM @t WHERE ID = (select top 1 id from @t where id > @ID order by id) 

Sie können eine verschachtelte top . Beispiel für den Fall "nächste Zeile".

 SELECT TOP 1 * FROM (SELECT TOP 2 * FROM YourTable WHERE id >= @currentId ORDER BY id) T ORDER BY id DESC 

und für die "vorherige Zeile"

 SELECT TOP 1 * FROM (SELECT TOP 2 * FROM YourTable WHERE id <= @currentId ORDER BY id DESC) T ORDER BY id ASC