Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.01.22;
Скачать: [xml.tar.bz2];

Вниз

помогите создать 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.61 MB
Время: 0.005 c
1-1281096380
Evgeney
2010-08-06 16:06
2012.01.22
Поиск компонентов и применение параметров


2-1318329821
Евгений07
2011-10-11 14:43
2012.01.22
Indy передать файл на сервер


3-1269545592
ruslan_as
2010-03-25 22:33
2012.01.22
Как скопировать таблицу Oracle в другую базу Oracle


2-1318237920
NBAH1990
2011-10-10 13:12
2012.01.22
Программная настройка подключения по локальной сети


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский