2009-08-19 1 views
2

는 내가 저장 프로 시저에 다음을 가로 질러 :Firebird 1.5에서 단일 SQL 쿼리의 개별 그룹 수를 계산합니까?

for 
    select 1 
    from scan_queue 
    where (date_time_locked is null  ) 
     and (scan_seqno >= :varMinScanSeqno) 
     and (scan_seqno <= :varMaxScanSeqno) 
    group by loan_id, collateral_id, insurance_id 
    into varNotUsed 
    do 
    varItemsToScan = varItemsToScan + 1; 

내 첫번째 생각이 아마 그룹의 수를 계산하는 비효율적 인 방법이지만, 내 두 번째 생각은 이봐, 당신은 어떻게 쓸 것 "이라고했다 어쨌든 하나의 쿼리에서? " 그리고 저는 좋은 대답을하지 못했습니다. (그래서 이것은 학문적 인 문제의 더 많은 것이다.) 그래서 같은 ID를 연결 한 솔루션을 찾고하지오전 :

select count(distinct loan_id || collateral_id || insurance_id) 
from scan_queue 
where (date_time_locked is null  ) 
    and (scan_seqno >= :varMinScanSeqno) 
    and (scan_seqno <= :varMaxScanSeqno) 

이 정보를 조회 할 수있는 가장 좋은 방법은 무엇입니까?

EDIT : 분명히 분명히 밝히지 않았으므로 Firebird v1.5를 사용하고 있습니다.

+1

내가 넣어 파이어 버드 (Firebird)를 태그로 사용하지만 명확히하기 위해 필자는 파이어 버드 1.5+ RDBMS와 함께 작동하는 솔루션에 특히 관심이 있습니다. :) – Nelson

+0

이 댓글은 질문의 일부가 될만큼 중요합니다! 파이어 버드가 DB 타입이라는 것도 알지 못했습니다! :) –

+0

@Aviad, 귀하의 추천에 따라 질문을 업데이트했습니다. 귀하의 의견을 주셔서 감사합니다 왜냐하면 나는 비교적 새로운 여기에 태그가 충분하다고 가정했기 때문에 (이것은 실제로 제 첫 질문입니다). – Nelson

답변

1

당신이 파이어 버드 1.5를 사용하고 있기 때문에, 깨끗한 해결책이 될 것 같지 않습니다.

Firebird 2.0에서는 이러한 질문에 대한 기본 요구 사항 인 'FROM 절의 하위 쿼리'표기법을 지원합니다. 다른 모든 대답을 참조하십시오.

깨끗한 솔루션이 필요한 경우 Firebird 2.1로 업그레이드하십시오. 그렇지 않으면 가지고있는 것만 큼 잘하는 것 같습니다.

(일부 다른 DBMS 임시 테이블을 지원, 파이어 버드 1.5 않는 경우, 당신은 다시 임시 테이블을 삭제 한 후 임시 테이블의 행을 계산, 임시 테이블에 초기 데이터를 선택할 수 있습니다.)

+0

결국 FB 2.1으로 업그레이드가 끝났습니다. 그동안 질문에 게시 된 코드를 사용했습니다. – Nelson

0

일반 올드로 무엇이 잘못 되었습니까? count(distinct ..)?

select count(*) from ( 
select loan_id, collateral_id, insurance_id 
from scan_queue 
where (date_time_locked is null  ) 
    and (scan_seqno >= :varMinScanSeqno) 
    and (scan_seqno <= :varMaxScanSeqno) 
group by loan_id, collateral_id, insurance_id 
) 
+1

DBMS에 실제로 유효한 SQL입니까? – Nelson

+0

Oracle 또는 Access에 없습니다. 어쩌면 SQL Server? 그러나 어쨌든, 뭔가 그것에 대해 잘못 생각합니다. 나는 그것을 시험 할 필요가 있었으면 좋겠다. 그것이 효과가 있다면, 나에게 그룹 by 절을 제거해야한다고 생각합니다. – user158017

+0

네가 맞아, 내 잘못이야 - 어쨌든이 일이 기억났다. 그걸 수정하자 .. –

-2

다소 효율적인지는 모르겠지만 하위 쿼리는이를 알 수 있습니다.

select count(grouping) 
from 
(select count(*) as grouping 
    from scan_queue 
    where (date_time_locked is null  ) 
     and (scan_seqno >= :varMinScanSeqno) 
     and (scan_seqno <= :varMaxScanSeqno) 
    group by loan_id, collateral_id, insurance_id) a 
+0

답장을 보내 주셔서 감사합니다. 그러나 저에게 도움이되지 못했습니다.어떤 DBMS를 사용하고 있습니까? – Nelson

+0

Oracle을 사용하고 있으며 액세스도 테스트했습니다. 어쩌면 나는 그 질문을 오해 했는가? 내 하위 쿼리에서 5 행을 반환하면 내 outquery는 "5"를 반환합니다. 그게 니가 찾고 있던거야? – user158017

+0

Elizabeth, 요구 사항을 완벽하게 이해하고 있지만이 쿼리는 불행히도 Firebird에서 유효한 구문이 아닙니다. – Nelson

-2

이 SQL 서버에서 작동 :

SELECT 
    COUNT(*) 
    FROM (SELECT 
       GroupColumn 
       FROM YourTable 
       WHERE ... 
       GROUP BY GroupColumn 
     ) dt 
+0

SQL Server가 아닌 Firebird를 사용하고 있습니다. – Nelson

+0

아마도 CTE 또는 간단한보기 fo를 사용하여 파생 테이블을 대체 할 수 있습니다. –

+0

응답 해 주셔서 감사합니다. 보기에 대한 귀하의 아이디어는 아마도 효과가 있지만 쿼리를 지원하기 위해 더 많은 메타 데이터를 만들고 싶지는 않습니다. 불행히도 v1.5에서는 CTE가 지원되지 않지만 분명히 v2.1에서 지원됩니다. 나는 FB v1.5가이 정보를 질의하는 우아한 방법이 없다고 의심하기 시작했다. – Nelson

관련 문제