添加序列记录号

时间:2013-10-08 14:30:59

标签: sql firebird firebird2.5

我有一个包含两个字段的表: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,答案不一定要使用上下文变量。

1 个答案:

答案 0 :(得分: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

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

相关问题