2013-10-08 2 views
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 ... 

Но я не удалось получить правильную последовательность. Я также пытался добавить больше переменных и других вещей, но никто не работал для меня, так как это должно быть сделано, чтобы я мог использовать один запрос select?

Я использую 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

Эта таблица имеет более 1 М записей, но в этом запросе предложение 'where' возвращает только 100 записей, поэтому я собираюсь использовать ваше решение. Благодарю. – Wel

+0

Я хочу спросить, если поле 'ID' повторяется, я нахожу, что' range_begin' не начинается с 1, так ли это обходное решение? – Wel

+0

Хм, а не от головы, прямо сейчас ... разве у вас нет ПК в таблице, которую вы могли бы использовать вместо «ID»? – ain

Смежные вопросы