#sql #database #select #top-n
#sql #База данных #выберите #top-n
Вопрос:
Мне нужно выполнить запрос, чтобы вернуть следующую (или предыдущую) запись, если определенная запись отсутствует. Например, рассмотрим следующую таблицу:
ID (primary key) value
1 John
3 Bob
9 Mike
10 Tom.
Я хотел бы запросить запись с идентификатором 7 или больше, если 7 отсутствует.
Мои вопросы,
- Возможны ли запросы такого типа с SQL?
- Как называются такие запросы в мире БД?
Спасибо!
Комментарии:
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