Как сделать счетчик sql
Нужен счетчик строк после инструкции SELECT: каков оптимальный подход SQL?
Я пытаюсь выбрать столбец из одной таблицы (без соединений), и мне нужно количество строк, в идеале, прежде чем я начну извлекать строки. Я пришел к двум подходам, которые предоставляют необходимую мне информацию.
подход 1:
или подход 2
Я делаю это, потому что мой драйвер SQL (SQL Native Client 9.0) не позволяет мне использовать SQLRowCount на Выберите оператор, но мне нужно знать количество строк в моем результате, чтобы выделить массив перед назначением ему информации. Использование динамически выделенного контейнера, к сожалению, не является вариантом в этой области моей программы.
Я обеспокоен тем, что может произойти следующий сценарий:
запрещает ли подход 2 эту проблему?
кроме того, будет ли один из двух подходов быстрее? Если да, то какой?
наконец, есть ли лучший подход, который я должен рассмотреть (возможно, способ поручить драйверу вернуть количество строк в выбранном результате с помощью SQLRowCount?)
для тех, кто спросил, я использую родной C++ с вышеупомянутым драйвером SQL (предоставленным Microsoft.)
10 ответов
есть только два способа быть на 100% уверенным, что COUNT(*) и фактический запрос даст последовательные результаты:
используя один из этих уровни изоляции важны, поскольку любой другой уровень изоляции позволяет новым строкам, созданным другими клиентами, стать видимыми в текущей транзакции. Прочитайте документацию MSDN на SET TRANSACTION ISOLATION для получения более подробной информации.
Если вы используете SQL Server, после запроса вы можете выбрать функцию @@RowCount (или если ваш результирующий набор может иметь более 2 миллиардов строк, используйте функцию BIGROW_COUNT ()). Это возвращает количество строк, выбранных предыдущим оператором, или количество строк, затронутых инструкцией insert/update/delete.
или если вы хотите, чтобы количество строк, включенных в результат, отправленный аналогично подходу №2, Вы можете использовать предложение OVER (см. http://msdn.microsoft.com/en-us/library/ms189461.aspx1).
использование предложения OVER будет иметь гораздо лучшую производительность, чем использование подзапроса для получения количества строк. Использование @@RowCount будет иметь лучшую производительность, потому что для оператора select @@RowCount не будет никаких затрат на запрос
Update в ответ на комментарий: пример, который я дал, даст # строк в разделе, определенном в этом случае «PARTITION BY мой стол.foo.» Значение столбца в каждой строке-это количество строк с одинаковым значением таблицы my_table.foo. Поскольку в вашем примере запроса было предложение » WHERE my_table.foo = ‘bar'», все строки в наборе результатов будут иметь одинаковое значение my_table.foo и, следовательно, значение в столбце будет одинаковым для всех строк и равным (в данном случае) этому # строк в запросе.
вот лучший / простой пример того, как включить столбец в каждую строку, которая является общим # строк в набор результатов. Просто удалите необязательное предложение Partition By.
Approach 2 всегда будет возвращать количество, соответствующее вашему набору результатов.
Я предлагаю вам связать подзапрос с вашим внешним запросом, чтобы гарантировать, что условие на вашем счете соответствует условию в наборе данных.
Если вас беспокоит количество строк, удовлетворяющих условию, может измениться за несколько миллисекунд с момента выполнения запроса и получения результатов, вы можете/должны выполнить запросы внутри транзакции:
это всегда возвращает правильные значения.
кроме того, если вы используете SQL Server, вы можете использовать @@ROWCOUNT, чтобы получить количество строк, затронутых последним оператором, и перенаправить вывод реальные запрос к temp таблица или переменная таблицы, поэтому вы можете вернуть все вместе, и нет необходимости в транзакции:
вот некоторые идеи:
Если вы действительно обеспокоены тем, что количество строк изменится между select count и Select statement, почему бы сначала не выбрать строки во временную таблицу? Таким образом, вы будете синхронизированы.
Почему бы вам не поместить свои результаты в вектор? Таким образом, вы не должны знать размер перед рукой.
возможно, вы захотите подумать о лучшем шаблоне для работы с данными этого типа.
никакой самонадеянный драйвер SQL не скажет вам, сколько строк ваш запрос вернет перед возвращением строк, потому что ответ может измениться (если вы не используете транзакцию, которая создает свои собственные проблемы.)
количество строк не изменится-google для ACID и SQL.
просто добавить это, потому что это лучший результат в google для этого вопроса. В sqlite я использовал это, чтобы получить rowcount.
Как добавить счетчик (автоинкремент) в запрос
8 ответов
Ох. Уважаемый, сколько же писать о том что нужно дать более полную информацию.
Какую БД Вы используете.
в запрос типа select никак
Вот здесь по transact-SQL
В MySQL есть параметр AUTO_INCREMENT.
если конкретнее то вот
Извините, забыл. FireBird 2.0.
Где-то на этом форуме видел, вроде Охотник333 приводил пример, но найти, к сожалению, не могу =(
Вот два примера. Но прикрутить к себе пока не хватает мозгов.
1) через подзапрос во фразе SELECT:
select (
select count(1)
from t t2
where t1.name >= t2.name
) as rn,
name,
age
from t t1
2) через селф-джойн и группировку:
select count(1) as rn,
t1.name,
t1.age
from t t1
join t t2
on t1.name >= t2.name
group by t1.name, t1.age
если у вас не существует счётчика, то запросом типа select вы его не создадите.
Для этих целей существует запрос ALTER TABLE (о конструкции написано выше)
Функция count() Calculates the number of rows that satisfy a query’s search condition. Available in SQL,DSQL, and isql. Это немного не то что Вы хотите.
Это ссылка на документацию
Это ссылка на FAQ с ответом на ваш вопрос, хотя на мой взгляд как то коряво. Использование тригера для автовычисляемых полей это не выход
Мне кажется здесь возникло непонимание нужд автора. Насколько я понял речь не идет об автоинкрементном поле в таблице, а идет о нумерации строк в выборке. Т.е. генераторы тут не при чем.
Вариантов вижу несколько:
1. Использовать хранимую процедуру, и делать выборку из нее.
2. Исользовать запросы, которые вы привели, если их можно модифицировать под ваши нужды. Но ИМХО, самообъединение таблиц для получения номера строки не самый быстродейственный вариант.
3. Нумеровать строки непосредственно в клиентском приложении.
P.S. Не в курсе последних версии FireBird, может там наконец появилась конструкция по аналогии с rownum в Оракле.
mysql> set @var:=0;
Query OK, 0 rows affected (0.00 sec)
Типы данных SQL Server
Было бы чудесно, если бы программы SQL Server и Access применяли один и тот же набор типов данных. Но у этих приложений разное происхождение и порой их отличия заметны.
К счастью, между большинством типов данных программ есть близкое соответствие. Это означает, что у большей части типов данных Access есть соответствующий тип данных SQL Server, очень близкий к типу Access. (Когда БД преобразуется, программа Access, как пра- вило, способна подобрать хорошее соответствие.) В табл. 20.1 приведены типы данных про- граммы SQL Server, которые вы получаете для разных типов данных Access.
У программы SQL Server есть еще много типов данных, не приведенных в этой таблице и не имеющих близких аналогов в программе Access. Но типы данных, которые включены в таблицу, — несомненно, самые распространенные.
Таблица 20.1. Сравнение типов данных SQL Server и Access
Эквивалент SQL Server
nvarchar (способен хранить до 4000 символов, в отличие от Текстового типа данных Access, у которого верхний предел составляет 255 символов)
Эквивалент SQL Server
Числовой (Number) (со значением в свойстве Размер поля (Field Size) — Целое (Integer))
Числовой (Number) (со значением в свойстве Размер поля (Field Size) — Длинное целое (Long Integer))
Числовой (Number) (со значением в свойстве Размер поля (Field Size) — Одинарное с плавающей точкой (Single))
Числовой (Number) (со значением в свойстве Размер поля (Field Size) —Двойное с плавающей точкой (Double))
Числовой (Number) (со значением в свойстве Размер поля (Field Size) —Действительное (Decimal))
Числовой (Number) (со значением в свойстве Размер поля (Field Size) — Байт (Byte))
Числовой (Number) (со значением в свойстве Размер поля (Field Size) — Код репликации (ReplicationID))
int (с параметром Identity равным Yes (Да))
nvarchar (сохраняется только имя файла)
Таблица 20.1 (окончание)
Возможно, вы заметили, что у программы SQL Server нет типа данных Счетчик. Но не дайте себя одурачить, решив, что нет способа получить это невероятно полезное средство в программе SQL Server. Просто задавать его придется немного иначе.
1. Когда создаете поле ID (Код), задайте для него тип данных int.
2. На вкладке Columns (Столбцы), расположенной под списком полей, задайте свойство Identity равным Yes (Да).
Значение параметра Identity — это имя поля типа Счетчик в программе SQL Server. Это имя программа присваивает автоматически и гарантирует его уникальность.
3. Вы также можете задать свойства Identity Seed (Начальное значение IDENTITY) и Identity Increment (Приращение IDENTITY).
? Значение Identity Seed (Начальное значение IDENTITY) — начальное значение. Это свойство — досадное упущение программы Access, которая всегда начинает считать с 1.
o Значение Identity Increment (Приращение IDENTITY) — величина, на которую программа SQL Server увеличивает очередное значение. Например, если Identity Increment — 5, вы увидите числа 1, 6, 11, 16 и т. д. Конечно, программа SQL Server может по разным причинам, как и программа Access, пропустить очередное значение.
Конструктор SQL Server лишен удобного мастера подстановки, который применяет программа Access. Вместо него вы должны выбрать поле, куда хотите поместить подстановку, щелкнуть кнопкой мыши вкладку Lookup (Подстановка) в нижней части окна конструктора (рис. 20.11) и затем заполнить все данные подстановки. Далее приведены ключевые параметры, необходимые для создания подстановки.
¦ В поле параметра Display Control (Тип элемента управления) следует задать Combo Box (Поле со списком), раскрывающийся список, позволяющий выбрать нужное значение.
¦ В поле параметра Row Source Type (Тип источника строк) нужно задать Tables/Views/Functions (Таблицы/представления/функции), если хотите создать подстановку, применяющую данные из связанной таблицы. (Если хотите предоставить просто список значений, можно использовать значение Value List (Список значений).)
Рис. 20.11. Подготовленная полностью подстановка для поля CreditCardID в таблице Orders
¦ В поле параметра Row Source (Источник строк) указываются данные для подстановки. Если данные извлекаются из другой таблицы, применяется SQL-команда SELECT, которая извлекает два поля — поле с описательной информацией и поле со значением ID (Код). Например, можно использовать команду SELECT ID, ProductName FROM Products ORDER BY ProductName для создания отсортированного по названию товара списка подстановки, который получает ID и название каждого товара из таблицы Products.
Если вы не хотите писать оператор SELECT самостоятельно, щелкните кнопкой мыши в этом поле и затем щелкните мышью кнопку с многоточием, открывающую окно запроса, в котором можно выбрать таблицу и поля. Это окно запроса немного отличается от Конструктора запросов программы Access, который вы использовали до этого.
¦ Параметр Bound Column (Связанный столбец) обозначает, какой столбец (из параметра Row Source (Источник строк)) должен быть добавлен в поле, когда выбрано значение из списка значений подстановки. Например, если первое поле в вашей команде SELECT — ID (как в предыдущем примере), нужно задать значение 1.
¦ В параметре Column Count (Число столбцов) задается количество столбцов, отображаемых в списке подстановки. Обычно задается значение 2 (для отображения обоих столбцов), но ширина первого столбца с номером ID задается бесконечно малой, поэтому вы его практически не видите.
¦ Параметр Column Heads (Заголовки столбцов) определяет, выводить ли заголовки в первой строке столбцов в списке подстановки. Обычно задается значение No (Нет). Однако если создается подстановка, отображающая несколько порций связанной информации, можно применить заголовки столбцов для того, чтобы легче было понять, что есть что, при просмотре списка подстановки.
¦ Параметр Column Width (Ширина столбцов) задает ширину каждого столбца в списке подстановки. Каждое значение в дюймах отделяется точкой с запятой. Например, значение 0 «;1» скрывает из вида первый столбец и делает второй столбец шириной 1 дюйм.
К сожалению, создание подстановки не формирует связь между двумя таблицами. Если вы хотите создать отношение, необходимо сделать это самостоятельно, как описано в следующем разделе.
Когда БД преобразуется, программе Access хватает изобретательности, чтобы сохранить все ваши подстановки.
Как вы узнали в главе 5, у каждой заслуживающей уважения БД есть множество отношений, В программе Access существуют два способа быстрого построения отношения: с помощью схемы данных и созданием подстановки в поле. Но в проекте Access ни одно из этих средств не доступно. Вместо этого вам придется определять отношения вручную в окне Конструктора для вашей таблицы.
Вот как это делается.
1. Откройте подчиненную или дочернюю таблицу в Конструкторе.
У этой таблицы есть поле, связанное с родительской таблицей. (Например, Products — дочерняя таблица для ProductCategories. Поле ProductCategorylD — связующее звено, которое присутствует в таблице Products.)
2. Выберите на ленте Table Tools | Design > Show/Hide > Property Sheet (Работа с таблицами | Конструктор > Показать или скрыть > Страница свойств).
Это действие выводит на экран диалоговое окно Properties (Свойства) (рис. 20.12), которое выглядит совсем не так, как Property Sheet (Окно свойств), которое вы применяли раньше в БД Access.
Рис. 20.12. Показано установленное отношение, связывающее таблицу OrderDetails (как дочернюю) с таблицей Products (как родительской). В каждой записи таблицы OrderDetails поле ProductID указывает на заказанный товар
3. Щелкните кнопкой мыши вкладку Relationships (Схема данных).
4. Щелкните кнопкой мыши кнопку New (Создать) для определения нового отношения.
5. В списке, расположенном под заголовком Primary key table (Таблица первичного ключа), выберите родительскую таблицу.
6. В первой строке, расположенной под именем таблицы, выберите однозначно определенное поле в родительской таблице.
(В этой области вкладки есть несколько строк, поскольку можно создавать отношения, основанные на нескольких полях, хотя это делается редко.)
7. В списке, находящемся под заголовком Foreign key table (Таблица внешнего ключа), выберите дочернюю таблицу.
В первой строке, расположенной ниже, выберите поле в дочерней таблице, которое указывает на связанную родительскую запись.
8. Если хотите убедиться в том, что существующие данные удовлетворяют данному отношению, установите флажок Check existing data on creation (Проверять существующие данные при создании).
Если не хотите проверять имеющиеся записи на соответствие правилам данного отношения, не устанавливайте этот флажок. Если в вашей таблице еще нет данных, ваш выбор не играет роли.
9. Установите флажок Enforce relationships for INSERTS and UPDATES (Обеспечить отношение для INSERT и UPDATE), если хотите обеспечить ссылочную целостность при добавлении и изменении записей.
Это действие не позволит нарушать правила отношения при добавлении и редактировании записей. Например, будет запрещена вставка дочерней записи, указывающей на несуществующую родительскую запись. Если вы решите не применять ссылочную целостность, можно использовать один из вариантов, расположенных ниже, для переключения на каскадные обновления или удаления.
10. Когда закончите, закройте окно.
Таблицы данных — не единственные объекты БД, хранящиеся в БД SQL Server. Ваша БД SQL Server может также содержать запросы, бесконечно полезные процедуры для поиска (или изменения) нужных записей.
У объектов, которые приверженцы программы Access называют запросами, совсем иное существование в SQL Server. Там, где вы видите запросы, программа SQL Server видит три объекта разных типов.
¦ View (Представление). Представление — приблизительный аналог запроса на выборку (select query) — он выбирает записи (возможно, из связанных таблиц) и отображает их на листе данных.
¦ User-defined function (Пользовательская функция). Пользовательская функция аналогична запросу на выборку с параметрами. (Как вы уже знаете, параметры позволяют запрашивать порцию информации сразу перед выполнением запроса. Эту информацию затем можно применить для отбора записей и выполнения вычисления.)
¦ Stored procedure (Хранимая процедура). Хранимая процедура — тяжеловес среди объектов БД SQL Server. Она может выполнять целый ряд задач, таких как выбор записей, фиксация изменений, выполнение транзакций. Вы не будете использовать большую часть этих возможностей, когда создадите хранимую процедуру в программе Access. Вместо этого вы будете применять хранимые процедуры для создания аналога запроса на изменение в SQL Server, который фиксирует в БД одиночную операцию обновления, добавления или удаления.
В следующем разделе вы попытаетесь приложить руки к созданию базового представления.
Как сделать счетчик sql
When called from inside a function, the extended stored procedure cannot return result sets to the client. Any Open Data Services API that returns result sets to the client will have a return code of FAIL.
The extended stored procedure can connect back to SQL Server; however, the procedure cannot join the same transaction as the original function that invoked the extended stored procedure.
Similar to invocations from a batch or stored procedure, the extended stored procedure is executed in the context of the Microsoft Windows� security account under which SQL Server is running. The owner of the extended stored procedure should consider this when granting permissions to other users to execute the procedure.
�1988-2002 Microsoft Corporation. All Rights Reserved.
| |
�������2003 Member ������: ������ | 2Alexander_fx 2 ������� ���� getdate() ������ newid() ��� ������� ����� ������������� ����������� ��� |
21 ��� 04, 13:09����[1196401] �������� | ���������� �������� ���������� |
| ||||||||||||||||||||||||||||
Alexander_fx Member ������: |
|