Я пытаюсь выбрать столбец из одной таблицы (без объединений), и мне нужно подсчитать количество строк, в идеале, прежде чем я начну извлекать строки. Я пришел к двум подходам, которые предоставляют необходимую мне информацию.
Подход 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 Native Client 9.0) не позволяет мне использовать SQLRowCount в инструкции SELECT, но мне нужно знать количество строк в моем результате, чтобы выделить массив перед назначением ему информации. Использование динамически размещаемого контейнера, к сожалению, не вариант в этой области моей программы.
Я обеспокоен тем, что может произойти следующий сценарий:
- SELECT для подсчета происходит
- Происходит другая инструкция, добавляющая или удаляющая строку
- Выполняется SELECT для данных, и вдруг массив имеет неправильный размер.
- В худшем случае это попытается записать данные за пределами массива и приведет к сбою моей программы.
Подход 2 запрещает эту проблему?
Кроме того, будет ли один из двух подходов быстрее? Если да, то какие?
Наконец, есть ли лучший подход, который я должен рассмотреть (возможно, способ указать драйверу возвращать количество строк в результате SELECT с помощью SQLRowCount?)
Для тех, кто спрашивал, я использую Native C++ с вышеупомянутым драйвером SQL (предоставленным Microsoft).