если ваши идентификаторы непрерывны, вы можете сделать
where id >= @id-2 and id <= @id+2
В противном случае, я думаю, вам придется union
3 запроса, один для получения записи с заданным идентификатором, а два других возятся с top
и order by
, как это
select *
from table
where id = @id
union
select top 2 *
from table
where id < @id
order by id desc
union
select top 2 *
from table
where id > @id
order by id
Производительность не будет слишком плохой, поскольку вы не извлекаете массивные наборы данных, но она не будет хорошей из-за использования union
.
Если вы обнаружите, что производительность начинает вызывать проблемы, вы можете добавить столбцы для хранения идентификаторов предыдущего и следующего элементов; вычисление идентификаторов с использованием триггера или ночной процесс или что-то. Это будет означать, что вы выполняете сложный запрос только один раз, а не каждый раз, когда он вам нужен.