5

如果某个记录不存在,我需要进行查询以返回下一个(或上一个)记录。例如考虑下表:

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

如果 7 不存在,我想查询 id 为 7 或更大的记录。

我的问题是,

  1. 这些类型的查询是否可以使用 SQL 进行?
  2. 在 DB 世界中,这样的查询叫什么?

谢谢!

4

4 回答 4

17

是的,这是可能的,但实施将取决于您的 RDBMS。

这是它在 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

在甲骨文中:

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

在那些具有“窗口”功能的 RDBMS 中(在 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

如果您不确定您拥有哪个 RDBMS:

select ID, value
from YourTable
where id = 
      ( select min(id)
        from YourTable
        where id >= 7
      )
于 2011-10-06T21:34:25.477 回答
1

试试这个 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
于 2011-10-06T21:33:15.487 回答
1

我会这样做:

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

top 1部分的实现是 T-SQL (MSSQL/Sybase),其他实现有所不同,但总是可能的 (mysql/postgre LIMIT 1, oracle rownum = 1)

于 2011-10-06T21:34:26.397 回答
0
select top 1 * from Persons where Id >= @Id order by Id
于 2011-10-06T21:33:30.253 回答