0 / 0 / 0
Регистрация: 27.12.2007
Сообщений: 22
|
|
1 | |
О Raw Count в MS SQL 200008.01.2008, 10:20. Показов 3498. Ответов 21
Метки нет Все метки)
(
вот прикольный на мой взгляд вопрос, как получить счетчик строк в отдельном столбце, типа:
RawCount | RecordID | RecordName 1 | 1 | FirstRec 2 | 7 | SecondRec 3 | 11 | NextRec 4 | 13 | AlsoRec 5 | 17 | OtherRec 6 | 18 | SmallRec 7 | 19 | BigRec ..... естественно в таблице хранятся только (RecordID & RecordName)?
0
|
|
08.01.2008, 10:20 | |
Ответы с готовыми решениями:
21
Совместимость SQL 2000 и Windows 2000 (hebrew) SQL 2000, Access 2000 и т.д. Access 2000 + SQL 2000 Rational rose + sql 2008 on windows 7 ultimate with sql 2000 (where you can't create a new table) |
0 / 0 / 1
Регистрация: 23.10.2007
Сообщений: 68
|
|
09.01.2008, 13:03 | 2 |
IMHO, надо пользовать процедурные расширения SQL-я
(не знаю, как это MS SQL Server-е называется): пишем ф-цию, инкрементирующею, переменную, ф-цию вставдяем в SQL-запрос.
0
|
0 / 0 / 0
Регистрация: 27.12.2007
Сообщений: 22
|
|
09.01.2008, 13:58 [ТС] | 3 |
пробовалось,
но в функцию видимо идет передача значения переменной, а не ссылки на переменную из запроса, поэтому невозможно изменить значение переменной запроса.
0
|
3 / 3 / 1
Регистрация: 06.11.2007
Сообщений: 75
|
|
09.01.2008, 15:35 | 4 |
Напр., создать темповую таблицу, в которую закачать инфо с помощью курсора из исходной таблицы. С одним селектом это сделать невозможно, т.к. возвращаемые данные селектом всегда трактуются как одно целое (множество), а в множествах невозможны операции над отдельными эл-тами.
0
|
0 / 0 / 1
Регистрация: 23.10.2007
Сообщений: 68
|
|
09.01.2008, 15:58 | 5 |
Я с SQL-сервером не знаком, работаю с Oracle.
В Oracle для каждой таблицы сущ. вычисляемый псевдостолбец rownum. Из него можно вытащить № записи. В SQL-сервере ,возможно, есть что-то подобное. По поводу инкрементирующей ф-ции: 1)можно передавать переменную in out параметром, приращать ее, и ее же возвращать. (правда могут возникнуть проблемы с ограничениями на параметры ф-ции, исп. в select-е. В PL/SQL не прокатило. Возможно SQL-сервер будет не таким щепетильным); 2) обьявить переменную глобально и написать ф-цию по ее приращению и возврату.
0
|
3 / 3 / 1
Регистрация: 06.11.2007
Сообщений: 75
|
|
09.01.2008, 16:14 | 6 |
Секундочку...
Ты хочешь сказать, что если написать ф-цию, кот. инкрементируется с каждым вызовом и использовать запрос типа: select func(), field1, field2,... from Table то в результате получиться: 1 <знач> <знач> 2 <знач> <знач> ... По моему получиться: 1 <знач> <знач> 1 <знач> <знач> ... в таком select`е функция будет вызвана 1 раз. Или я что-то не понимаю.
0
|
0 / 0 / 1
Регистрация: 23.10.2007
Сообщений: 68
|
|
09.01.2008, 16:52 | 7 |
To johnr
Поясняю свою мысль: function Inc(Val in out number, IncBy in number) return number as begin Val:=Val+ IncBy; return Val; end; ----------------------------- v number; v:=0; select inc(v,1) RowNumber, MyField1, MyField2....... from MyTable; Т.к. параметр Val явл. in out, то переданная туда переменная v ,будет приращенна на IncBy и вернется в ф-цию inc(v,1) уже в измененном состоянии: 1-я запись из выборки: v=0 RowNumber=v+IncBy=1; 2-я запись из выборки: v=1 RowNumber=v+IncBy=2 и т.д. Ф-ция Inc возвр. Val для возможности исп. ее в select-е. Однако если ф-ция исп. в select-е, то Oracle накладывает на нее ограничение: параметр ф-ции может быть либо in, либо out. Ограничение, IMHO, весьма странное. Вполне возможно, что приведенная выше схема будет работать на других СУБД.
0
|
98 / 1 / 1
Регистрация: 28.01.2007
Сообщений: 53
|
||||||
09.01.2008, 17:21 | 8 | |||||
Если таблицу называть MyTable
То для MS SQL это будет выглядеть так:
0
|
3 / 3 / 1
Регистрация: 06.11.2007
Сообщений: 75
|
|
09.01.2008, 17:28 | 9 |
Это будет правильно работать только при условии, что все RecordID разные.
0
|
0 / 0 / 1
Регистрация: 23.10.2007
Сообщений: 68
|
|
09.01.2008, 17:37 | 10 |
To VbGuest:
а) нумерация будет начинаться с нуля, что есть неправильно; б) если RecordID=null, то RecordCount=0; в) IMHO, скорость выполнения подобного запроса оставляет желать лучшего.
0
|
0 / 0 / 0
Регистрация: 27.12.2007
Сообщений: 22
|
|
09.01.2008, 17:48 [ТС] | 11 |
to VbGuest:
работает, но ситуация осложняенся немного - если мы сортируем, а очень намного при резком возрастании кол-ва строк. Но работает. to xGrey: функционал MS SQL даже 2000-го в отличии от Oracle 8i(9i) оставляет желать лучшего, а посему параметры не обьявляются как in или out, и как я уже писал глобальная переменная из запроса в функцию передается по значению а не по ссылке то бишь инрементируя ее мы увеличиваем значение ее копии в памяти а необходимая нам переменная остается при своем же значении. to johnr: это одно из очевидных решений, но время, просто когда записей десятки тысяч, то высокоуровневый SQL слишком будет долго возится как и в случае с представленным SQL query from VbGuest. Так как я инициатор затеи по поиску решения, я хочу обьяснить, что искомое решение представлялось мне в виде какой-нибудь системной переменной наподобие Oracle-ого RowNum, но похоже MicroSoft не предоставляет такого решения в своих СУБД, а жаль.
0
|
3 / 3 / 1
Регистрация: 06.11.2007
Сообщений: 75
|
|
09.01.2008, 18:02 | 12 |
Я так понимаю, что используется рез-т этого запроса в приложении. Почему бы не реализовать изменение приходящего DataSet уже в приложении.
Это можно сделать более быстро, чем на SQL
0
|
0 / 0 / 0
Регистрация: 27.12.2007
Сообщений: 22
|
|
09.01.2008, 18:34 [ТС] | 13 |
пока используем Recordset,
короче если быть еще более корректным, то необходимо получить выборку из n элементов после m элемента в отсортированной таблице, опять же при имеющихся данных и очевидном решении (Recordset.PageSize & RecordSet.AbsolutePage) тратится 13 секунд для вывода этого списка, далее был составлен не хитрый запрос с использованием set rowcount n или too n, который занимает всего 3 секунды, но список невозможно отсортировать. Поэтому и возникла мысль а вдруг есть системная переменная как в Ora.
0
|
98 / 1 / 1
Регистрация: 28.01.2007
Сообщений: 53
|
||||||
09.01.2008, 19:45 | 14 | |||||
Можно еще так:
0
|
0 / 0 / 1
Регистрация: 23.10.2007
Сообщений: 68
|
|
09.01.2008, 20:47 | 15 |
Я опять со свиным рылом (Oracle 8i)
в калашный ряд (MS SQL-Server 2000) ![]() Наверняка в SQL-Server-е имеется возможность генерить уникальные значения (в Ora - sequenser - последовательность). Нельзя ли создать/пересоздать подобный объект БД, настроить его на генерацию целых чисел (нач. с 1 с шагом 1) и использовать в select-е в качестве инкременты? Должно работать шустро.
0
|
3 / 3 / 1
Регистрация: 06.11.2007
Сообщений: 75
|
|
10.01.2008, 09:56 | 16 |
to NikolayLosev:
Может быть это есть не лучшее решение, но: Если таблица не слишком часто изменяется или нет особой необходимости сразу же после изменения получать в Select уже новые данные, то можно создать несколько дополнительных таблиц, которые будут играть роль RowNum для каждого из возможных order by. Перестраивать эти таблицы при каждом insert или update ненужно. Достаточно выполнять эти действия по расписанию (например). Или ввести глобальную переменную, которая играла бы роль флага. Флаг можно устанавливать в триггерах.... Вобщем вариантов много.
0
|
0 / 0 / 0
Регистрация: 15.03.2007
Сообщений: 40
|
|
26.01.2008, 10:36 | 17 |
sequense's в SQL нет, но есть инкрементальные переменные, где можно задать шаг
это менее гибко, чем в Oracle, но хотя бы кое-что
0
|
0 / 0 / 0
Регистрация: 27.12.2007
Сообщений: 22
|
|
27.01.2008, 09:39 [ТС] | 18 |
to phwp:
это какие-такие?
0
|
0 / 0 / 0
Регистрация: 15.03.2007
Сообщений: 40
|
||||||
27.01.2008, 21:00 | 19 | |||||
0
|
weirdrabbit
|
||||||
09.02.2008, 16:45 | 20 | |||||
можно сделать так:
можно еще создать таблицу с полем IDENTITY, делать в нее SELECT, вынимать данные, а потом через TRUNCATE обнулять таблицу и счетчик в ней |
09.02.2008, 16:45 | |
Помогаю со студенческими работами здесь
20
Перенос баз из Sql 2000 и 2005 в Sql 2012 Как подключить SQL 2000 БД на SQL 2005 Оптимизация sql-запроса с Count()
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |