1

我有一个包含两个字段的表:ID 字段(FID)作为主键,并且Qty都是整数。我需要查询此表并使用 QTY 字段添加两个附加字段作为序列序列,以便我可以获得如下结果:

table1
-------------------------------------
ID   Qty   range_begin   range_end
50   2         1           2
53   1         3           3
65   3         4           6
67   2         7           8     

range_begin字段从 1 开始,下一条记录应该是range_end + 1. 和range_end = last range_end + Qty

我尝试使用上下文变量来编写它 像这样

我首先将所有变量设置为空

rdb$set_context('USER_TRANSACTION', 'range_end', null);
rdb$set_context('USER_TRANSACTION', 'range_begin', null);

比我开始查询:

Select 
  rdb$get_context('USER_TRANSACTION', 'range_begin'),
  rdb$set_context('USER_TRANSACTION', 'range_begin', COALESCE(CAST(rdb$get_context('USER_TRANSACTION', 'range_end') AS INTEGER), 0) + 1)),

  rdb$get_context('USER_TRANSACTION', 'range_end'),
  rdb$set_context('USER_TRANSACTION', 'range_end', COALESCE(CAST(rdb$get_context('USER_TRANSACTION', 'range_end') AS INTEGER), 0) + Qty)),

  Qty
  from table1 where ... 

但我没能得到正确的顺序。我还尝试添加更多变量和其他东西,但没有一个对我有用,所以应该如何完成,以便我可以使用单选查询?

我使用的是 FireBird 2.5,答案没有必要使用上下文变量。

4

1 回答 1

2

基本上,你想要的是

SELECT t.ID, t.QTY, 
  ((select coalesce(sum(qty),0) from table1 a where a.ID < t.ID) + 1) as RANGE_BEGIN,
  ((select coalesce(sum(qty),0) from table1 a where a.ID < t.ID) + t.qty) as RANGE_END
FROM table1 t

对于大表,这可能会变慢,因此您可能希望使用永久字段并计算触发器中的范围值而不是计算字段……这取决于数据如何变化等。

于 2013-10-08T15:47:55.243 回答