Ich versuche, eine Spalte aus einer einzelnen Tabelle (keine Joins) auszuwählen, und ich brauche die Anzahl der Zeilen, idealerweise bevor ich mit dem Abrufen der Zeilen beginne. Ich habe zwei Ansätze gefunden, die die benötigten Informationen liefern.
Ansatz 1:
SELECT COUNT( my_table.my_col ) AS row_count
FROM my_table
WHERE my_table.foo = 'bar'
Dann
SELECT my_table.my_col
FROM my_table
WHERE my_table.foo = 'bar'
Oder Ansatz 2
SELECT my_table.my_col, ( SELECT COUNT ( my_table.my_col )
FROM my_table
WHERE my_table.foo = 'bar' ) AS row_count
FROM my_table
WHERE my_table.foo = 'bar'
Ich tue dies, weil mein SQL-Treiber (SQL Native Client 9.0) die Verwendung von SQLRowCount bei einer SELECT-Anweisung nicht zulässt, ich aber die Anzahl der Zeilen in meinem Ergebnis kennen muss, um ein Array zuzuordnen, bevor ich ihm Informationen zuweise. Die Verwendung eines dynamisch zugewiesenen Containers ist in diesem Bereich meines Programms leider keine Option.
Ich befürchte, dass das folgende Szenario eintreten könnte:
Lässt sich dieses Problem mit Ansatz 2 vermeiden?
Wird einer der beiden Ansätze schneller sein? Wenn ja, welcher?
Und schließlich: Gibt es einen besseren Ansatz, den ich in Betracht ziehen sollte (vielleicht eine Möglichkeit, den Treiber anzuweisen, die Anzahl der Zeilen in einem SELECT-Ergebnis mit SQLRowCount zurückzugeben)?
Für diejenigen, die gefragt haben, ich verwende Native C++ mit dem oben erwähnten SQL-Treiber (von Microsoft bereitgestellt).
Hier sind einige Ideen:
Vielleicht sollten Sie über ein besseres Muster für den Umgang mit Daten dieser Art nachdenken.
Kein SQL-Treiber wird Ihnen sagen, wie viele Zeilen Ihre Abfrage zurückgeben wird, bevor Sie die Zeilen zurückgeben, denn die Antwort könnte sich ändern (es sei denn, Sie verwenden eine Transaktion, was eigene Probleme mit sich bringt).
Die Anzahl der Zeilen wird sich nicht ändern - googeln Sie nach ACID und SQL.