我有一个包含两个字段的表: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,答案不一定要使用上下文变量。
答案 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
对于大表,这可能会变慢,因此您可能希望使用永久字段并计算触发器中的范围值而不是计算字段...它取决于数据更改的方式等。