0 / 0 / 0
Регистрация: 27.12.2007
Сообщений: 22
1

О Raw Count в MS SQL 2000

08.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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.01.2008, 10:20
Ответы с готовыми решениями:

Совместимость SQL 2000 и Windows 2000 (hebrew)
mne kazhetsa chto i win 2000(rus) est ta zhe problema: pri popitke sozdanija new table SQL...

SQL 2000, Access 2000 и т.д.
На сегодняшний день просто очень актуальных для меня вопроса: 1. Имеется поле ФИО, соответственно...

Access 2000 + SQL 2000
Кто нибудь знает, почему access 2000 не коннектится к ms sql 2000? что надо сделать, чтоб...

Rational rose + sql 2008 on windows 7 ultimate with sql 2000 (where you can't create a new table)
Ситуация: установлена windows 7, на ней установлено: 1) SQL 2000, в котором невозможно создавать...

21
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 это будет выглядеть так:
T-SQL
1
2
Select RecordID, RecordName, (Select Count(*) From MyTable MT
Where MT.RecordID < MyTable.RecordID) As RecordCount From MyTable
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
Можно еще так:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
begin
    CREATE TABLE #t1 (
           RecordID             int,
           RecordName           varchar(64,
           RowCount             int IDENTITY(1,1))
 
    INSERT INTO #t1 (RecordID, RecordName)
    SELECT RecordID, RecordName
    FROM MyTable
    select * from #t1
    drop table #t1
end
будет быстрее.
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
T-SQL
1
2
3
4
CREATE TABLE [aaa] (
    [a] [int] IDENTITY (1, 1) NOT NULL 
) ON [PRIMARY]
GO
0
weirdrabbit
09.02.2008, 16:45 20
можно сделать так:
T-SQL
1
2
3
SELECT IDENTITY(int, 1,1) AS ID_Num
INTO NewTable
FROM OldTable
но все равно через 1 таблицу придется все делать

можно еще создать таблицу с полем IDENTITY,
делать в нее SELECT, вынимать данные,
а потом через TRUNCATE обнулять таблицу и счетчик в ней
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.02.2008, 16:45
Помогаю со студенческими работами здесь

Перенос баз из Sql 2000 и 2005 в Sql 2012
Добрый день, возникла необходимость переехать на новый сервер SQL, но столкнулся с трудностями. ...

Как подключить SQL 2000 БД на SQL 2005
Здравствуйте у меня БД сделанный на SQL 2000 хотел подключить на SQL 2005 через Attach выдает...

Оптимизация sql-запроса с Count()
Добрый день! Имеется таблица Table1 --id int primary key identity(1,1) --UserIP varchar(15) -...

SQL запрос, Count из нескольких таблиц
Здравствуйте, помогите написать один запрос для следующих таблиц: Пусть есть таблица персонала:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru