Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

помогите создать SQL запрос


Страницы:   1 2 3 4

toropoff ©   (2011-10-10 18:16:00) 

есть таблица с полем ID.
нумерую сам при добавлении.
необходимо произвести перенумерацию упорядочив по определенному полю, например naimen.
база Access.
в таблице около полусотни тысяч записей.
путем перебора очень долго получается.
хотелось бы одним запросом перенумеровать поле ID значением номера строки.
что-то типа
UPDATE myTable SET id =  номер записи
но как-то ещё учесть упорядочивание по полю naimen

простите что прошу готовое решение, никак не получается


armstrong   (2011-10-11 14:53:00) [21]

Ega23 ©, не могли бы Вы для тупых чуть пояснить?
может через хранимую процедуру попробывать?


Ega23   (2011-10-11 14:44:00) [22]


> проверил 4000 записей - 15 секунд.


use SQL, Luke!


armstrong   (2011-10-11 14:37:00) [23]

Inovet ©, через жопу это точно.. но так уже налажена работа...

пока сделал так:

procedure TAutoNumerate.Execute;
begin
 TempQuery:= TADOQuery.create(dm);  TempCommand:= TADOCommand.Create(dm);

 try
   TempQuery.Connection:= DM.ADOConnection;  TempCommand.Connection:= DM.ADOConnection;

   TempCommand.Parameters.CreateParameter('newkod', ftInteger, pdInput, 10, 0);
   TempCommand.Parameters.CreateParameter('oldkod', ftInteger, pdInput, 10, 0);
   TempCommand.Parameters.CreateParameter('mynaimen', ftString,  pdInput, 50, '');

   TempCommand.CommandText:= 'update '+IntToStr(dmu.arrTab[myСurTabSheet].idTable)+' set n = :newkod where (n=:oldkod) and (naimen= :mynaimen)';
   TempCommand.ParamCheck:= true;   TempCommand.Prepared:= true;

   TempQuery.sql.Add('select n, naimen from mytable order by naimen');    
   TempQuery.open; TempQuery.first;

   while not TempQuery.Eof do begin

      TempCommand.Parameters.FindParam('newkod').Value:=  firstNumb;
      TempCommand.Parameters.FindParam('mynaimen').Value:=  TempQuery.Fields[1].AsString;
      TempCommand.Parameters.FindParam('oldkod').Value:=  TempQuery.Fields[0].AsInteger;
      TempCommand.Execute;
      inc(firstNumb);
      TempQuery.next;

   end;

 finally
   TempQuery.Close; TempQuery.Free; TempCommand.free;
   PostMessage(form1.Handle, wm_myEvent, Integer(unit1.myEventRefreshGrid), 0);
   AutoNumerate:= nil;
   MessageBeep(0);
 end;

end;


проверил 4000 записей - 15 секунд.

я вот не пойму советуют
"делается запрос на создание таблицы с нужной сортировкой, потом в полученную таблицу вставляется автосчетчик запросом alter table xxx add column yyy counter."

"select ... into НоваяТаблица .... order by naimen
И второй запрос, alter table НоваяТаблица add column id counter"

но мои знания SQL слабоваты, никак не могу понять как это предлагается реализовать..


Inovet   (2011-10-11 13:37:00) [24]

> [50] Anatoly Podgoretsky ©   (11.10.11 08:54)
> И решение два - уйдите от намерации, замените кодами товара
> - это вообще будет 0 секунд

Так надо же проктально сделать - кадый месяц грохать старый прайс и создавать новый с новыми кодами.


Anatoly Podgoretsky   (2011-10-11 08:54:00) [25]

50 000 записей, это менее 10 секунд, при по рекодном обновление с клиента.

И решение два - уйдите от намерации, замените кодами товара - это вообще будет 0 секунд


sniknik   (2011-10-11 08:07:00) [26]

> он с из точки зрения идеален, а виновата в тормозах система
вот эта вот фраза (и не только)
> сейчас упакую базу и проверю..
вместо "сейчас сделаю пример с кодом и проблемными данными и выложу."
заставляет так думать


sniknik   (2011-10-11 07:59:00) [27]

> DisableControls
> EnableControls
> не забудь
не только. многое можно "забыть" (не читая справки/не пробуя/не понимая принципов) и после "валить" на тормознутость ADO/Access/системы в общем оправдывая себя любимого...

> Не знаю насколько относится к именно акцессу ...
слабо относится... у меня вот получилось 5-ти секундное ускорение (35 сек) при открытии базы монопольно. такая вот особенность. но делать ограничения на "всем выйти из программы, счаз буду цикл делать" ради 5ти сек думаю не стоит.

> Впрочем маловато данных, приведите тормозящий код, можно будет попытаться посмотреть почему медленно.
о!!! с чего надо начинать. а то сделают свой "ламеризм" и считая, что проблема точно не в них, их коде (хотя когда, и если доходит до показа без слез на него не взглянешь), он с из точки зрения идеален, а виновата в тормозах система, начинают искать "альтернативу".

> Значит опять та самая сага о x,y,z.
да пофиг. пусть уже делает своего "монстра".


Кщд   (2011-10-11 06:56:00) [28]

>armstrong   (11.10.11 02:41) [43]
>Q7: Как сымитировать счетчик в обычном запросе либо ленточной форме?
получим глупости при дубликатах в t.f


Германн   (2011-10-11 04:02:00) [29]


> Inovet ©   (11.10.11 02:35) [41]
>
> > [39] Германн ©   (11.10.11 02:11)
> > А автор хочет именно по "порядку записей". Думая что такой
> > порядок есть.
>
> Да по имени он хочет, см выше.
>

Значит опять та самая сага о x,y,z.


Servy   (2011-10-11 03:23:00) [30]

Не знаю насколько относится к именно акцессу, но стоит попробовать вынести весь цикл с апдейтами в одну транзакцию, если это вдруг не сделано. А то автокоммит минитранзакции по апдейту в каждом теле цикла с записью на диск - штука печальная.

Впрочем маловато данных, приведите тормозящий код, можно будет попытаться посмотреть почему медленно.


Inovet   (2011-10-11 03:04:00) [31]

> [43] armstrong   (11.10.11 02:41)

Уже сказали, что такие запросы будут медленные.

Делай циклом по датасету. Параметры используй и Prepare перед циклом - будет несколько быстрее.


armstrong   (2011-10-11 02:41:00) [32]

Inovet ©, да конечно )  

на sql.ru :

Q7: Как сымитировать счетчик в обычном запросе либо ленточной форме?

A1:
SELECT (Select Sum(1) From t AS p Where p.f


Inovet   (2011-10-11 02:38:00) [33]

> [40] armstrong   (11.10.11 02:29)
> если у sniknik © "172 тыс... = 40 сек." то это вполне устраивает.
> сейчас упакую базу и проверю..

DisableControls
EnableControls
не забудь


Inovet   (2011-10-11 02:35:00) [34]

> [39] Германн ©   (11.10.11 02:11)
> А автор хочет именно по "порядку записей". Думая что такой
> порядок есть.

Да по имени он хочет, см выше.


armstrong   (2011-10-11 02:29:00) [35]

да ничего я не думаю..
порядок конечно же есть.
если я в запросе указал oprder by naimen то и порядок будет по этому полю.
мне нужно теперь заполнить поле kod текущим порядковым номером записи.
да бог с ним, я понял что одним запросом не получится.
буду выносить в отдельный поток нумерацию в тупом переборе.
если у sniknik © "172 тыс... = 40 сек." то это вполне устраивает.
сейчас упакую базу и проверю.. хотя на моём i7 будут отличаться результаты от операторского 4-го пня :)
спасибо всем!


Германн   (2011-10-11 02:11:00) [36]


> ну, порядок записей все одно есть, он просто не гарантированный,
>  без сортировки...
>

А автор хочет именно по "порядку записей". Думая что такой порядок есть.


sniknik   (2011-10-11 01:44:00) [37]

> А "номер записи" это фикция! Такая же как и RecNo. Более того - это одно и то же!
ну, порядок записей все одно есть, он просто не гарантированный, без сортировки...

если не важно как пронумерует, то просто (и самое быстрое)  удалить ID и тут же создать его с типом авто инкремент (альтер тебле). готово. но ни о каком упорядочивании по именам в этом случае не может быть речи.


sniknik   (2011-10-11 01:40:00) [38]

> sniknik ©, да в том то и дело, что изменение поля при простом переборе занимает до получаса. в таблице около 50т. записей.
ключница водку делала... © Иван Васильевич меняет профессию...

проверил у себя на 172 тыс... = 40 сек. вся "перенумеровка", подозреваю на 50 тыс. будет быстрее...

p.s. что вообще за привычки у людей не учится делать, а искать варианты.


armstrong   (2011-10-11 01:39:00) [39]

знайка, так оператор в проге ищет запись по номеру..

Германн ©, так в sql RecNo не вставить.. поэтому я просто хотел показать что нужно..


Германн   (2011-10-11 01:34:00) [40]


> Германн ©, RecNo наверное "бзик", я просто хотел показать
> что нужен номер записи..

А "номер записи" это фикция! Такая же как и RecNo. Более того - это одно и то же!


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо