Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.01.22;
Скачать: CL | DM;

Вниз

помогите создать SQL запрос   Найти похожие ветки 

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

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


 
Inovet ©   (2011-10-11 02:35) [41]

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

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


 
Inovet ©   (2011-10-11 02:38) [42]

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

DisableControls
EnableControls
не забудь


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

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

на sql.ru :

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

A1:
SELECT (Select Sum(1) From t AS p Where p.f<=p1.f), p1.f
FROM t AS p1
ORDER BY p1.f;

A2:
SELECT DCount("f", "t","f<=" & CStr(f)), f
FROM t
ORDER BY f;

тогда пока не сдаюсь, про DCount не знал...   (:


 
Inovet ©   (2011-10-11 03:04) [44]

> [43] armstrong   (11.10.11 02:41)

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

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


 
Servy ©   (2011-10-11 03:23) [45]

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

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


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


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

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


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

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


 
sniknik ©   (2011-10-11 07:59) [48]

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

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

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

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


 
sniknik ©   (2011-10-11 08:07) [49]

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


 
Anatoly Podgoretsky ©   (2011-10-11 08:54) [50]

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

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


 
Inovet ©   (2011-10-11 13:37) [51]

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

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


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

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 слабоваты, никак не могу понять как это предлагается реализовать..


 
Ega23 ©   (2011-10-11 14:44) [53]


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


use SQL, Luke!


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

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


 
Inovet ©   (2011-10-11 15:03) [55]

> [53] Ega23 ©   (11.10.11 14:44)
> > проверил 4000 записей - 15 секунд.
>
> use SQL, Luke!

Так было 30 минут, теперь быстрее в 1800 / 15 > 100 раз


 
Inovet ©   (2011-10-11 15:12) [56]

> [52] armstrong   (11.10.11 14:37)
> and (naimen= :mynaimen)

Наименование зачем менять сомо на себя

Ещё это можно заменить
TempCommand.Parameters.FindParam("newkod")
TempCommand.Parameters.FindParam("oldkod")


на индекс - один раз его определить, потом
TempCommand.Parameters[ioldkod].Values
TempCommand.Parameters[inewkod].Values


 
Inovet ©   (2011-10-11 15:24) [57]

> [52] armstrong   (11.10.11 14:37)

И эта. Где DisablerControls хоть их и нет?


 
Ega23 ©   (2011-10-11 15:25) [58]


> не могли бы Вы для тупых чуть пояснить?


Мог бы. Я уже выше писал: ID суть неприкосновенная вещь. С каким ID ты товар завёл, ровно с таким же ID он и должен умереть.
Для решения твоей проблемы (ИМХО, крайне надуманной) нужно завести в таблице ещё одно поле, что-нибудь типа PositionNr int not null
И вот его уже и перестраивать.
Как это сделать с помощью SQL для Access я не в курсе, ибо с ним не работал. Для MSSQL - нет проблем. Для Access, ИМХО, тоже, надо только чуток мануал покурить.


 
Inovet ©   (2011-10-11 15:34) [59]

> [58] Ega23 ©   (11.10.11 15:25)
> Для решения твоей проблемы (ИМХО, крайне надуманной) нужно
> завести в таблице ещё одно поле, что-нибудь типа PositionNr
> int not null

Тогда уж и историю этих PositionNr надо не в таблице с товарами держать, а сделать отдельную таблицу навроде год, месяц, ID, PositionNr. Иначе нафиг нужен ID если есть и так уникальный n. И вообще автор судя по
IntToStr(dmu.arrTab[myСurTabSheet].idTable)
каждый месяц создаёт новую таблицу.


 
Cobalt ©   (2011-10-11 16:04) [60]

Кстати, интересный вопрос :-)
Делаю выборку, допустим, товаров из базы, упорядоченных по алфавиту, и хочу вывести с порядковым номером
Этакий Автоинкремент.
Спасет ли OnCalcFields орд (если такая фигня нужна только для печати)?


 
Ega23 ©   (2011-10-11 16:10) [61]


> Спасет ли OnCalcFields

В частном случае - да.
В общем - нет.


 
Sergey13 ©   (2011-10-11 16:10) [62]

> [60] Cobalt ©   (11.10.11 16:04)
> если такая фигня нужна только для печати

Если только для печати - в репортерах обычно есть функция печати порядкового номера.


 
Inovet ©   (2011-10-11 16:18) [63]

> [60] Cobalt ©   (11.10.11 16:04)
> Спасет ли OnCalcFields орд (если такая фигня нужна только для печати)?

Событие срабатывает много от чего, как-то инкремент в нём некошерно делать. Если только открыть и двигаться вниз, то вроде получиться. Но зачем оно так нужно.


 
Cobalt ©   (2011-10-11 16:56) [64]

Т.е в общем случае придется заняться интимными отношениями с Select"ом и хранимкой?


 
Inovet ©   (2011-10-11 17:01) [65]

> [64] Cobalt ©   (11.10.11 16:56)
> Т.е в общем случае придется заняться интимными отношениями с Select"ом и хранимкой?

Для ручной печати нумеровать во время вывода, а так генераторы отчётов есть для этого.


 
Ega23 ©   (2011-10-11 17:14) [66]


> Т.е в общем случае придется заняться интимными отношениями
> с Select"ом и хранимкой?


В общем - непонятно. Суть задачи лично мне так до сих пор и неясна.


 
OW ©   (2011-10-11 17:42) [67]

вот что правильно:
Для ручной печати нумеровать во время вывода, а так генераторы отчётов есть
для этого.

но,
вот такой трюк находил как-то. Чисто из любопытства

select
(select count(s.name)
from mytable s
where s.name < = t.name) as mycount,
t.name
from mytable t
order by t.name


 
знайка   (2011-10-11 17:49) [68]


> вот такой трюк находил как-то.
Это не в [20] ли посту? :)


 
Anatoly Podgoretsky ©   (2011-10-11 19:29) [69]


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

Менять коды, это же сумашедствие.


 
sniknik ©   (2011-10-11 20:03) [70]

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


 
SQLEX ©   (2011-10-11 20:23) [71]


> знайка   (11.10.11 17:49) [68]

м-да? :) нет :))
на не свои вопросы, чтобы не зашорится, не читаю чужих советов
кроме Мастеров (ну и еще пару человек )


 
Кщд   (2011-10-12 11:06) [72]

>OW ©   (11.10.11 17:42) [67]
>вот такой трюк находил как-то. Чисто из любопытства
это же путь в ад
опуская проблему с дубликатами имен, делать - теоретически - full table scan для каждой строки результирующего набора только для того, чтобы пронумеровать?


 
OW ©   (2011-10-12 11:14) [73]


> это же путь в ад

+1


 
Труп Васи Доброго ©   (2011-10-12 13:00) [74]

Попробуй рассказать по русски что откуда берётся и куда кладётся.
"Оператор формирует новый прайс" - КАК???
1) Тупо стирает базу товаров и набирает руками заново? Тогда о какой выборке и скорости речь?
2) Оператор создаёт новый прайс на основе некоего справочника товаров? Как происходит процесс и куда помещается результат? Он проставляет некие метки в справочнике, что товар выбран или переносит сведения о товаре в некую новую таблицу? Опять не ясно о какой выборке и скорости речь, если оператор руками всё делает. Главный вопрос - если в любом случае создаётся НОВАЯ (в смысле пустая) таблица "каталог товаров" и заполняется раз в месяц, то КТО МЕШАЕТ один раз заполнить поле ID, сразу после создания таблицы оператором? Создал -> отсортировал -> пронумеровал (способ ИМХО не имеет значения ибо любой будет быстрым по сравнению со временем заполнения таблицы оператором).
Поясни что не так?



Страницы: 1 2 вся ветка

Текущий архив: 2012.01.22;
Скачать: CL | DM;

Наверх




Память: 0.63 MB
Время: 0.011 c
15-1317445057
Gtxfnm
2011-10-01 08:57
2012.01.22
Печать больших форматов на А4


15-1317710577
TUser
2011-10-04 10:42
2012.01.22
Фестиваль науки


15-1317627402
OW
2011-10-03 11:36
2012.01.22
Задумка. Игра Пираты. Интересно ли будет?


2-1318398757
TeteriN
2011-10-12 09:52
2012.01.22
Косвенное обращение к объектам


15-1317617050
И. Павел
2011-10-03 08:44
2012.01.22
Обновление программы в Windows 7