SQL-запрос для выбора «следующей» записи (аналогичной первой или верхней N)

#sql #database #select #top-n

#sql #База данных #выберите #top-n

Вопрос:

Мне нужно выполнить запрос, чтобы вернуть следующую (или предыдущую) запись, если определенная запись отсутствует. Например, рассмотрим следующую таблицу:

 ID (primary key)    value
1                    John
3                    Bob
9                    Mike
10                   Tom.
  

Я хотел бы запросить запись с идентификатором 7 или больше, если 7 отсутствует.

Мои вопросы,

  1. Возможны ли запросы такого типа с SQL?
  2. Как называются такие запросы в мире БД?

Спасибо!

Комментарии:

1. Вы имеете в виду, что запрос возвращается только 9 Mike при поиске 7 ?

Ответ №1:

Да, это возможно, но реализация будет зависеть от вашей СУБД.

Вот как это выглядит в MySQL, PostgreSQL и SQLite:

 select ID, value
from YourTable
where id >= 7
order by id
limit 1
  

В MS SQL-Server, Sybase и MS-Access:

 select top 1 ID, value
from YourTable
where id >= 7
order by id
  

В Oracle:

 select * from (
    select ID, value
    from YourTable
    where id >= 7 
    order by id
)
where rownum = 1
  

В Firebird и Informix:

 select first 1 ID, value
from YourTable
where id >= 7
order by id
  

В DB / 2 (этот синтаксис соответствует стандарту SQL-2008):

 select id, value
from YourTable
where id >= 7
order by id
fetch first 1 rows only
  

В тех СУБД, которые имеют «оконные» функции (в стандарте SQL-2003):

 select ID, Value
from (
  select 
    ROW_NUMBER() OVER (ORDER BY id) as rownumber,
    Id, Value
  from YourTable
  where id >= 7
) as tmp                  --- remove the "as" for Oracle
where rownumber = 1
  

И если вы не уверены, какая у вас СУБД:

 select ID, value
from YourTable
where id = 
      ( select min(id)
        from YourTable
        where id >= 7
      )
  

Комментарии:

1. Только что добавлены SQLite и Informix в список.

2. И решение оконной функции.

Ответ №2:

Попробуйте это для MS-SQL:

 SELECT TOP 1 
id, value 
FROM your_table
WHERE id >= 7
ORDER BY id
  

или для MySQL

 SELECT id, value 
FROM your_table
WHERE id >= 7
ORDER BY id
LIMIT 0,1
  

Ответ №3:

Я бы просто сделал это так:

 select top 1 * from myTable where id >=7
order by id
  

реализация top 1 части — T-SQL (MSSQL / Sybase), другие реализации различаются, но это всегда возможно (mysql / postgre LIMIT 1 , oracle rownum = 1 )

Ответ №4:

 select top 1 * from Persons where Id >= @Id order by Id