2009-08-19 7 views
2

я натыкался следующее в хранимой процедуре:Получить количество отдельных групп в одном SQL-запросе в Firebird 1.5?

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; 

Моя первая мысль была, что это, вероятно, является неэффективным способом подсчета количества групп, но моя вторая мысль была, «эй, как бы вы написать что в одном запросе? И у меня не было хорошего ответа. (Таким образом, это скорее академический вопрос.) Я не ищет решение, объединяющее идентификаторы, например, так:

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 как тег, но только для уточнения, меня особенно интересует решение, которое работает с Firebird 1.5+ RDBMS. :) – Nelson

+0

Этот комментарий достаточно важен, чтобы быть частью вопроса! Я даже не знал, что Firebird - это тип DB! :) –

+0

@Aviad, я обновил вопрос в соответствии с вашими рекомендациями. Спасибо за ваш комментарий, потому что я относительно новичок и предположил, что тег будет достаточным (на самом деле это мой первый вопрос). – Nelson

ответ

1

Поскольку вы используете Firebird 1.5, не похоже, чтобы быть чистым раствором.

Firebird 2.0 поддерживает «подзапросы в нотации FROM», которые являются основным требованием для ответа на такие вопросы - см. Все остальные ответы.

Итак, если вам нужно чистое решение, перейдите на Firebird 2.1. В противном случае то, что у вас есть, похоже, так же хорошо, как вы можете получить.

(Некоторая другая СУБД поддерживает временные таблицы, если Firebird 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

Действительно ли это действительно SQL в вашей СУБД? – Nelson

+0

Это не в Oracle или Access. возможно, SQL Server? Но в любом случае что-то не так. Хотел бы, чтобы у меня было то, что мне нужно было проверить. Если это сработает, мне кажется, что групповое предложение должно быть удалено. – 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

Спасибо за ответ, но это не сработало для меня.Какие СУБД вы используете? – Nelson

+0

Я использую Oracle, и я тоже тестировал это в доступе. Может, я неправильно понял вопрос? Если мой подзапрос возвращает 5 строк, то мой запрос возвращает «5». Это то, что вы искали? – user158017

+0

Элизабет, вы прекрасно понимаете это требование, но этот запрос, к сожалению, не является допустимым синтаксисом в Firebird. – Nelson

-2

это работает на SQL Server:

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

Я использую Firebird, а не SQL Server. – Nelson

+0

возможно, вы можете использовать CTE или простой вид fo для замены производной таблицы –

+0

Спасибо за ответ. Ваша идея представления, вероятно, будет работать, но я не знаю, что я хотел бы создать больше метаданных для поддержки запроса. К сожалению, я не поддерживаю CTE в версии 1.5, но, видимо, он поддерживается в версии 2.1. Я начинаю подозревать, что FB v1.5 просто не имеет элегантного способа запросить эту информацию. – Nelson