2009-08-19 6 views
2

Ich lief über die folgenden in einer gespeicherten Prozedur:Anzahl der verschiedenen Gruppen in einer einzigen SQL-Abfrage in Firebird 1.5 erhalten?

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; 

Mein erster Gedanke war, dass dies die Anzahl der Gruppen zu zählen, aber mein zweiter Gedanke war wahrscheinlich ein ineffizienter Weg ist: „Hey, wie würden Sie schreiben dass in einer einzigen Abfrage überhaupt? " Und ich hatte keine gute Antwort. (Das ist also eher eine akademische Frage.) Ich bin nicht Suche nach einer Lösung, die die IDs verknüpft, etwa so:

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) 

Was ist der beste Weg, um diese Informationen abzufragen?

BEARBEITEN: Da ich das anscheinend nicht klar genug gemacht habe, verwende ich Firebird v1.5.

+1

Ich habe Firebird als Tag, aber nur zur Klärung, ich bin speziell an einer Lösung interessiert, die mit Firebird 1.5+ RDBMS funktioniert. :) – Nelson

+0

Dieser Kommentar ist wichtig genug, um ein Teil der Frage zu sein! Ich wusste gar nicht, dass Firebird ein DB-Typ war! :) –

+0

@Aviad, ich aktualisierte die Frage gemäß Ihrer Empfehlung. Danke für deinen Kommentar, weil ich hier relativ neu bin und angenommen habe, das Tag wäre ausreichend (das ist eigentlich meine erste Frage). – Nelson

Antwort

1

Da Sie Firebird 1.5 verwenden, gibt keine saubere Lösung zu sein scheint.

Firebird 2.0 unterstützt die 'Sub-Abfragen in der FROM-Klausel' Notation, die eine grundlegende Voraussetzung für die Beantwortung solcher Fragen ist - siehe alle anderen Antworten.

Wenn Sie also eine saubere Lösung benötigen, führen Sie ein Upgrade auf Firebird 2.1 durch. Ansonsten scheint das, was Sie haben, ungefähr so ​​gut zu sein, wie Sie bekommen können.

(Einige andere DBMS unterstützen temporäre Tabellen, wenn Firebird 1.5 der Fall ist, um die ersten Daten in eine temporäre Tabelle auswählen könnte, dann die Zeilen in der temporären Tabelle zählen, dann die temporäre Tabelle wieder fallen.)

+0

Wir haben schließlich auf FB 2.1 aktualisiert. In der Zwischenzeit habe ich den Code in der Frage verwendet. – Nelson

0

Was ist los mit plain alt count(distinct ..)?

+1

Ist das tatsächlich gültige SQL in Ihrem DBMS? – Nelson

+0

Es ist nicht in Oracle oder Access. vielleicht SQL Server? Aber irgendwie fühlt sich etwas falsch an. Ich wünschte, ich hätte was ich brauche, um es zu testen. Wenn es funktionieren würde, scheint mir die Gruppenklausel entfernt zu werden. – user158017

+0

Sie haben Recht, mein Schlechter - irgendwie erinnerte ich mich, dass das funktionieren würde. Lass mich das beheben .. –

-2

Ich weiß nicht, ob es mehr oder weniger effizient ist, aber eine Unterabfrage würde es tun.

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

Danke für die Antwort, aber das hat nicht für mich funktioniert.Welches DBMS benutzt du? – Nelson

+0

Ich benutze Oracle und habe dies auch im Zugriff getestet. Vielleicht habe ich die Frage missverstanden? Wenn meine Unterabfrage 5 Zeilen zurückgibt, gibt meine Outquery "5" zurück. Haben Sie danach gesucht? – user158017

+0

Elizabeth, Sie verstehen die Anforderung perfekt, aber diese Abfrage ist leider keine gültige Syntax in Firebird. – Nelson

-2

das funktioniert auf SQL Server:

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

Ich verwende Firebird, nicht SQL Server. – Nelson

+0

vielleicht können Sie ein CTE oder eine einfache Ansicht verwenden, um die abgeleitete Tabelle zu ersetzen –

+0

Danke für die Antwort. Ihre Idee einer Ansicht würde wahrscheinlich funktionieren, aber ich weiß nicht, dass ich mehr Metadaten erstellen möchte, um die Abfrage zu unterstützen. Ich habe leider keine CTE-Unterstützung in Version 1.5, aber anscheinend wird es in Version 2.1 unterstützt. Ich fange an zu vermuten, dass FB v1.5 einfach keine elegante Möglichkeit hat, diese Informationen abzufragen. – Nelson

Verwandte Themen