Я пытаюсь выбрать столбец из одной таблицы (без объединений), и мне нужно подсчитать количество строк, в идеале, прежде чем я начну извлекать строки. Я пришел к двум подходам, которые предоставляют необходимую мне информацию.
Подход 1:
SELECT COUNT( my_table.my_col ) AS row_count
FROM my_table
WHERE my_table.foo = 'bar'
Тогда
SELECT my_table.my_col
FROM my_table
WHERE my_table.foo = 'bar'
Или Подход 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'
Я делаю это, потому что мой драйвер SQL (собственный клиент SQL 9.0) не позволяет мне использовать SQLRowCount в операторе SELECT, но мне нужно знать количество строк в моем результате, чтобы выделить массив, прежде чем присваивать информацию Это. Использование динамически размещенного контейнера, к сожалению, не вариант в этой области моей программы.
Я обеспокоен тем, что может произойти следующий сценарий:
- SELECT для подсчета происходит
- Другая инструкция, добавление или удаление строки
- SELECT для данных происходит, и вдруг массив имеет неправильный размер.
-В худшем случае это попытается записать данные за пределы массива и вывести мою программу из строя.
Запрещает ли подход 2 эту проблему?
Кроме того, будет ли один из двух подходов быстрее? Если да, то что?
Наконец, есть ли лучший подход, который я должен рассмотреть (возможно, способ инструктировать драйвер возвращать количество строк в результате SELECT с использованием SQLRowCount?)
Для тех, кто спросил, я использую Native C ++ с вышеупомянутым драйвером SQL (предоставлен Microsoft.)