我在存储过程中遇到了以下内容:
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 )
查询此信息的最佳方式是什么?
编辑:由于我显然没有说清楚,我使用的是Firebird v1.5。
答案 0 :(得分:1)
由于您使用的是Firebird 1.5,因此似乎没有一个干净的解决方案。
Firebird 2.0支持“FROM子句中的子查询”表示法,这是回答此类问题的基本要求 - 请参阅所有其他答案。
因此,如果您需要一个干净的解决方案,请升级到Firebird 2.1。否则,你所拥有的东西似乎就像你能得到的一样好。
(其他一些DBMS支持临时表;如果是Firebird 1.5,则可以将初始数据选择到临时表中,然后计算临时表中的行,然后再次删除临时表。)
答案 1 :(得分: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
)
答案 2 :(得分:-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
答案 3 :(得分:-2)
这适用于SQL Server:
SELECT
COUNT(*)
FROM (SELECT
GroupColumn
FROM YourTable
WHERE ...
GROUP BY GroupColumn
) dt