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

Вниз

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

 
toropoff   (2011-10-10 18:16) [0]

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

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


 
toropoff   (2011-10-10 18:22) [1]

крутится что то такое

UPDATE mytable a SET ID =
(SELECT номер записи? FROM  mytable b WHERE a.ID=b.ID ORDER by Naimen)

не, бред какой-то..


 
Ega23 ©   (2011-10-10 19:35) [2]

id нельзя менять.
Заведи рядом поле, его нумеруй как угодно.


 
armstrong   (2011-10-10 20:13) [3]

простите что вероятно неверно описал проблему.
ID поле не autoincrement а обычное.


> Заведи рядом поле, его нумеруй как угодно


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

тоесть  есть:  kod, naimen
1  петя
2  вася
3  антон

должно
1  антон
2  вася
3  петя


 
stas ©   (2011-10-10 20:23) [4]

Если это нужно сделать единоразово, то сделайте так:
select kod, naimen into New_table from mytable  order by Naimen
Потом удалите mytable, создайте в таблице New_table  поле типа счетчик назовите ID и переименуйте ее в mytable.


 
armstrong   (2011-10-10 20:37) [5]

да в том то и дело, что это не единоразово..
да и счетчик мне никак не подходит.

а если без учета сортировки, то как будет выглядеть
UPDATE mytable  SET ID = физический номер записи ?


 
Сергей М. ©   (2011-10-10 21:07) [6]


> физический номер записи


Не кури эту траву.


 
Омлет ©   (2011-10-10 21:17) [7]

http://www.trevor.easynet.co.uk/AccFAQ/queries.htm#counter


 
armstrong   (2011-10-10 21:39) [8]

Сергей М. ©,
при select * from mytable порядок записей будет как физически они сохранены. или не так?
ну не в этом дело..

Омлет ©, мне не нужен счетчик.

мне нужно одним махом через UPDATE  занести в поле RecNo (Integer) порядковый номер записи.


 
Омлет ©   (2011-10-10 21:53) [9]

> armstrong   (10.10.11 21:39) [8]
> мне не нужен счетчик.
> мне нужно одним махом через UPDATE  занести в поле RecNo (Integer) порядковый номер записи.


Чтобы получить твой порядковый номер, надо сначала построить выборку. Т.е. без временной таблицы не обойтись.


 
armstrong   (2011-10-10 22:08) [10]

да я вот и думаю как-то так:

UPDATE mytable a SET ID =
(SELECT номер записи? FROM  mytable b WHERE a.ID=b.ID)


 
Inovet ©   (2011-10-10 22:22) [11]

В Инете было несколько вариантов решения, может и на ДМ было.


 
armstrong   (2011-10-10 22:26) [12]

эх.. да гуглил уже..
а самому слабо что-то, тямы не хватает..


 
stas ©   (2011-10-10 22:47) [13]


> armstrong   (10.10.11 22:08) [10]
> да я вот и думаю как-то так:
>

нет  такой функции.
И зачем это вообще нужно?


 
armstrong   (2011-10-10 23:08) [14]

нужно автоматически пронумеровать записи.
автонумерация не подходит.
путем перебора очень долгий процесс..
пытался вынести в отдельный поток, но все равно нужно синхронизировать функцию смены ID значения, один фиг минут 20 проход выходит в тысяч 50 записей.
вот думаю как бы в одну команду через update это сделать.
ну на фокспро в запросе RecNo и есть номер записи..
а тут х.з. даже ..


 
armstrong   (2011-10-10 23:08) [15]

на фоксе было бы replace ID with recno()


 
stas ©   (2011-10-10 23:35) [16]

armstrong   (10.10.11 23:08) [14]
Это я понял.
А цель перенумерации какая, тем более делать это постоянно ?


 
Inovet ©   (2011-10-10 23:53) [17]

Когда наблюдаются странные желания, закрадывается сомнение - а надо ли это на самом деле или надо сделать совсем не так.

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


 
Ega23 ©   (2011-10-11 00:00) [18]


> при select * from mytable порядок записей будет как физически
> они сохранены. или не так?


Не так. Гарантированный порядок сортировки будет только в случае Order by, всё остальное не гарантируется.


> мне нужно одним махом через UPDATE  занести в поле RecNo
> (Integer) порядковый номер записи.


Что такое "порядковый номер записи"?

Я всегда в order by могу этот порядок поменять. А также потом на клиенте этот порядок поменять. А потом ещё и отфильтровать, как на клиенте, так и на сервере.

Ответь на один простой вопрос: какую проблему ты решаешь?


 
Ega23 ©   (2011-10-11 00:01) [19]


> ну на фокспро в запросе RecNo и есть номер записи..

Он меняется, понимаешь? Меняется. Сейчас он один, через 5 минут - другой. А запись - та же самая.


 
знайка   (2011-10-11 00:02) [20]

что-то типа такого
select *,
(select count(z.id) from mytable z where z.id <= mytable.id) as rownumber
from mytable


 
Inovet ©   (2011-10-11 00:07) [21]

> [18] Ega23 ©   (11.10.11 00:00)
> Я всегда в order by могу этот порядок поменять.

Автор так и хочет сделать

> [0] toropoff   (10.10.11 18:16)
> необходимо произвести перенумерацию упорядочив по определенному полю, например naimen.

Только зачем нужна нумерация в базе, ещё и постоянно требуется её обновлять - вот это странное желание.


 
Ega23 ©   (2011-10-11 00:08) [22]


> Только зачем нужна нумерация в базе, ещё и постоянно требуется
> её обновлять - вот это странное желание.


Сильно подозреваю, что это опять сага о XYZ


 
Inovet ©   (2011-10-11 00:09) [23]

> [20] знайка   (11.10.11 00:02)
> select *,
> (select count(z.id) from mytable z where z.id <= mytable.id) as rownumber
> from mytable

Только naimen надо.


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

есть простой список: код, наименование
что-то добавляется, что то удаляется.
каталог печатается, клиенты заказы делают по номеру.

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

не спрашивайте зачем такая хрень нужна.

знайка, спасибо! интересный запрос, пока ничего не понятно..
а как это будет выглядеть с update ?


 
armstrong   (2011-10-11 00:49) [25]


> select *,
> (select count(z.id) from mytable z where z.id <= mytable.
> id) as rownumber
> from mytable


насколько я понимаю мысль, в вашем примере пронумеровать используя упорядочивание по наименованию не получится.
даже без упорядочивания не получится, если id будут одинаковы.


 
Ega23 ©   (2011-10-11 00:53) [26]

Бред какой-то.
Впрочем, твои проблемы. СУБД какая?


 
sniknik ©   (2011-10-11 00:58) [27]

> интересный запрос, пока ничего не понятно..
это спец запрос для внесения "солидности" в программу... там где "путем перебора" ([0])  меньше минуты, тут будет меньше часа... и чем дальше тем больше, в прогрессии.
+ "закладка" на существующие, и возрастающие, значения ID. для произвольной сортировки бесполезен.


 
armstrong   (2011-10-11 01:05) [28]

Ega23 ©, Access, если это можно назвать СУБД.

sniknik ©, а у Вас мысли есть как можно это сделать?

была бы нормальная СУБД через хранимые процедуры накрайняк что-то слепил, может быстрее чуток было бы..
но тут тупым перебором другой раз пол часа уходит.
не думал с утра что так всё сложно окажется :(


 
sniknik ©   (2011-10-11 01:20) [29]

> а у Вас мысли есть как можно это сделать?
если бы не ваши ограничения... типа. только запросом, то мысль - перебор по рекордсету. 30 сек раз в месяц не такая уж тяжкая ноша...


 
Германн ©   (2011-10-11 01:20) [30]


> была бы нормальная СУБД через хранимые процедуры накрайняк
> что-то слепил, может быстрее чуток было бы..

А чем Аксесс "ненормальная" БД?
Если речь только о том, чтобы раз в месяц формировать отчёт?

Все ваши посты упоминают RecNo. Это ваш бзик такой?
У "нормальной" БД нет никакого RecNo!"
Сравните, например, с файловой системой. Какой файл первый, какой последний?


 
знайка   (2011-10-11 01:23) [31]

а печатает тоже Access, или как?


 
armstrong   (2011-10-11 01:27) [32]

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

tempQuery.first;
while not eof do begin

 пробывал через edit post, через update - один фиг до получаса..

 next;
end;

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


 
armstrong   (2011-10-11 01:29) [33]

знайка,
да не.. все на delphi.
вывод в файл формата excel"я


 
знайка   (2011-10-11 01:33) [34]

ну так пусть excel и нумерует, у него это получится куда быстрее


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


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

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


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

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

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


 
sniknik ©   (2011-10-11 01:40) [37]

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

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

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


 
sniknik ©   (2011-10-11 01:44) [38]

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

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


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


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

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


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

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



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

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

Наверх




Память: 0.57 MB
Время: 0.008 c
4-1243546594
imprezident
2009-05-29 01:36
2012.01.22
Работа с компонентами стороннего приложения


15-1318001461
Leon-Z
2011-10-07 19:31
2012.01.22
MySQL &amp; ODBC ???


2-1318359297
Gu
2011-10-11 22:54
2012.01.22
обработчик


15-1318010585
Android Master
2011-10-07 22:03
2012.01.22
Ищу форум по программированию Андроида.


15-1315145637
DVM
2011-09-04 18:13
2012.01.22
Официально вышла RAD Studio XE2