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

Вниз

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

Наверх





Память: 0.55 MB
Время: 0.003 c
2-1309862102
Darvin
2011-07-05 14:35
2012.01.22
проблема с трассировкой


2-1318332506
серый
2011-10-11 15:28
2012.01.22
Из DBGrid в TStringGrid


15-1317904579
handle
2011-10-06 16:36
2012.01.22
нужно корректно перевести на англ. фразу


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


15-1317846605
Юрий
2011-10-06 00:30
2012.01.22
С днем рождения ! 6 октября 2011 четверг





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский