2013-10-08 3 views
1

두 개의 필드가있는 테이블이 있습니다. ID 필드 (FID)는 기본 키이고 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); 

를 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

음, 내 머리 꼭대기가 아니라 ... 'ID'대신 사용할 수있는 테이블에 PK가 없습니까? – ain