我正在使用Oracle数据库表存储可能包含多个事件的订单,并且每个订单都必须根据version
字段按顺序处理。
此表的基本结构包含3列:Order ID
;前面提到的Version
;和Processed
,一个简单的1/0 boolean
标志,用于了解订单版本是否已处理。
所有订单的处理是批量执行的,所以我正在努力编写一个SELECT
语句,为每个订单ID获取单个结果集上的下一个未处理版本。
有人知道如何实现这一目标吗?
答案 0 :(得分:1)
就是这样:
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索引,它会对此查询提供帮助;)