用于从多个优先级队列中获取值的SELECT语句

时间:2017-09-21 16:09:55

标签: sql database oracle

我正在使用Oracle数据库表存储可能包含多个事件的订单,并且每个订单都必须根据version字段按顺序处理。

此表的基本结构包含3列:Order ID;前面提到的Version;和Processed,一个简单的1/0 boolean标志,用于了解订单版本是否已处理。

所有订单的处理是批量执行的,所以我正在努力编写一个SELECT语句,为每个订单ID获取单个结果集上的下一个未处理版本。

有人知道如何实现这一目标吗?

1 个答案:

答案 0 :(得分:1)

就是这样:

SQL Fiddle

Oracle 11g R2架构设置

查询1

SELECT ID, MIN(version) , field1, field2
FROM t 
WHERE processed = 0 
GROUP BY ID, field1, field2

<强> Results

| ID | MIN(VERSION) |               FIELD1 |               FIELD2 |
|----|--------------|----------------------|----------------------|
|  1 |            2 | field1 char(20)      | field2 char(20)      |
|  2 |            5 | field1 char(20)      | field2 char(20)      |

查询2

select id, version, processed, field1, field2 from t

<强> Results

| ID | VERSION | PROCESSED |               FIELD1 |               FIELD2 |
|----|---------|-----------|----------------------|----------------------|
|  1 |       1 |         1 | field1 char(20)      | field2 char(20)      |
|  1 |       2 |         0 | field1 char(20)      | field2 char(20)      |
|  1 |       3 |         0 | field1 char(20)      | field2 char(20)      |
|  2 |       5 |         0 | field1 char(20)      | field2 char(20)      |
|  2 |      10 |         0 | field1 char(20)      | field2 char(20)      |
|  3 |       4 |         1 | field1 char(20)      | field2 char(20)      |
顺便说一句,不要忘记在(processed,version)上添加B-TREE索引,它会对此查询提供帮助;)