2013-10-08 72 views
1

我有一個帶有兩個字段的表格:作爲主鍵的ID字段(FID)和Qty都是整數。我需要查詢該表,並使用數量字段,以便我能得到這樣的結果增加兩個字段順序串行:1添加序列記錄號

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場開始,下一個記錄應該是range_end + 1。 而range_end = last range_end + Qty

我嘗試使用上下文變量,如本

寫它,我將所有的變量設置爲null第一

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,並且它不需要使用上下文變量的答案。

回答

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 

對於一個大表,這可能很慢,所以不是你可能想使用永久字段和計算觸發值範圍計算領域的...它取決於數據如何變化等。

+0

此表有超過1M個記錄,但在此查詢中,where子句僅返回100條記錄,因此我將使用您的解決方案。謝謝。 – Wel

+0

我想請問,如果'ID'字段重複我覺得'range_begin'不是從1開始,所以有沒有解決方法呢? – Wel

+0

嗯,現在還沒有脫離我的頭頂......你有沒有在桌子上可以使用一些PK而不是「ID」? – ain