# 获取连续区间
SmartMarket 交易所的系统中,所有订单在生成时,都从一个 oracle Sequence 中获取唯一的
序列号,完成交易计算后各个撮合程序将其插入如下的 orders 表中:
```sql
create table orders
(
id integer primary key,
content json
-- ignore other definitions...
);
```
后续的结算系统需要连续的获取订单,以便处理一些顺序敏感的业务。但是撮合发生在很多个异步节
点上,它们只能保证最终会将所有订单都保存到 orders 表,确保 id 列最终是连续的,但是最新
插入的一段记录集有可能不连续。而我们希望结算系统成批的读取数据,以优化性能,那么在结算系
统有它最后处理的订单id的前提下,下面哪一个查询可以确保从这个id向前读取 id 连续 的一批
订单?
点击进入[MySQL实战练习环境](https://mydev.csdn.net/product/pod/new?image=cimg-centos7-skilltreemysql&connect=auto&create=auto&utm_source=skill){target="_blank"}。
* `show databases;` 列出所有数据库
* `show tables;` 列出所有表
## 答案
```sql
with recursive r(id) as (
select id
from orders
where id = $1
union
select d.id
from orders as d
join r on d.id = r.id + 1)
select orders.id, content
from orders
join r on orders.id = r.id;
```
## 选项
### A
没有办法构造一个简单查询实现这个功能,因为它的数据过滤条件递归的依赖查询结果。
### B
```sql
select data.id, content
from orders
join orders as r on orders.id = r.id - 1
where id = $1;
```
### C
```sql
select id, content
from orders
where id in (
select id
from orders
where id = id + 1);
```
### D
```sql
with r as (select id
from orders
where id = $1
union
select d.id
from orders as d
join r on d.id = r.id + 1)
select orders.id, content
from orders
join r on orders.id = r.id;
```