![]() |
|
Модераторы: LSD |
![]()
|
|
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 14 Всего: 207 |
Допустим есть таблица:
Num| ID | Date ------------------- 01 | AA |07/10/03 02 | BB | 03 | CC |08/10/03 04 | AA |03/10/03 05 | BB | Надо сделать кверю, которая для всех ID='BB' в поле Date занесла значение из предыдущего рекорда (сортировка по Num), т.е. в конечном итоге хочу: Num| ID | Date ------------------- 01 | AA | 07/10/03 02 | BB | 07/10/03 03 | CC | 08/10/03 04 | AA | 03/10/03 05 | BB | 03/10/03 База данных MS Access, но интересно послушать есть ли решение и для других баз данных (вариант с наложением курсора и перебиранием записей в цикле не предлагать - сам знаю, тем более в MS Access такое не работает) Собственно эта задача была решена лет 5 назад при помощи QBE+Paradox - там такое делается не легко, а очень легко, но времена меняются - теперь MS Access + SQL актуален... -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: нет Всего: 44 |
Если поле с Id=bb стоит первым, какое занчение заносится в Date ?
Можно ли при решении задачи создавать промежуточные таблицы/запросы -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
| Medved |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 3 Всего: 154 |
PL/SQL - это можно сделать не напрягаясь, с помощью функции decode. -------------------- |
|||
|
||||
| Cashey |
|
||||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: нет Всего: 60 |
Access я не знаю, но на FoxPro эта задача будет решаться так:
создается функция
затем вызываем из программы
-------------------- библия учит любить ближнего, а камасутра обучает как именно |
||||
|
|||||
| vickr |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 13.5.2003 Где: Санкт-Петербург Репутация: нет Всего: нет |
Синтаксис SQL вряд ли позволит возвращать готовый результат в нужной форме. Необходимо изменять данные в процессе их отображения в форме - отслеживать событие Current, например, или как еще. С Access давненько не возился, но идея в голову приходит именно такая.
Vit Если не получится - post here, можно будет подумать. --------------------
Каждую секунду, тыкая в клавиши, мы давим насмерть не менее 1000 микробов =:) |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 14 Всего: 207 |
2 Nastya - ну это уже вопрос более простой, например можно ничего не делать, или вставить какое-то конкретное значение
2 Pegas - это понятно, в T-SQL это тоже реализуется относительно не сложно, но путём наложения курсора, что не очень приемлемо 2 Cashey - так же как и в любых системах, которые позволяют писать какой-никакой скрипт, а я хочу в запросе, в программе или процедурой Access я и сам могу реализовать (и реализовал уже, а вот чистым запросом как?) 2 vickr - форма здесь ни причём, я не Select делаю, а Update - никаких результатов никуда не выводится, над базой данных производится серия манипуляций, никакого интерфейса нет. В идеале - есть набор из сотни кверей которые просто запускаются и делают всё что нужно с файлом mdb, затем файл пересылается для дальнейшей обработке другому процессу на другом компьютере и возможно вообще не для меня а для какого-то клиента, который использует файл в своих собственных системах, собственно оговорены структуры таблиц и стандарты их заполнения, дальнейшее использование базы данных может быть очень разнообразным и не всегда под моим контролем... Но есть часть манипуляций которая не может быть выполненна через квери - это тот пример что я привёл, а также квери которые затрагивают 2 базы данных - одна на Access, другая на MS SQL Server - приходится программно проходить таблицы рекорд за рекордом, что мне не очень нравится. -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| gray_k |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1015 Регистрация: 9.1.2003 Где: Москва Репутация: нет Всего: 22 |
Насколько я знаю такое возможно в специализированных SQL (Oracle или MS-SQL). А стандартым запросом которые поддерживали бы все SQL-сервера скорее всего не получится. В Interbase такое не получится, так же как и в MySQL. Здесь надо писать хранимую процедуру. Причём для каждого сервера свою.
-------------------- С уважением. Gray. |
|||
|
||||
| gray_k |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1015 Регистрация: 9.1.2003 Где: Москва Репутация: нет Всего: 22 |
vit
И какая разница в конце концов. Ведь такой запрос, который ты хочешь сделать ИМХО всё равно просмотрит все записи в таблице. В Interbase есть такая штука как план запроса. В нём показываются все действия над базой, которые делает запрос. НЕ знаю есть ли такое в MS-SQL, но если есть то посмотрев его по идее ты должен увидеть, что происходит полный перебор таблицы. Просто их надо оптимально проиндексировать. -------------------- С уважением. Gray. |
|||
|
||||
| Medved |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 3 Всего: 154 |
ИМХО подругому никак.....
-------------------- |
|||
|
||||
| Cashey |
|
|||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: нет Всего: 60 |
Vit, SQL-запрос по своей сути является циклом т.е. все равно бегает по всей базе и команда Update присваевает значение ячейке только той записи на которой находится. Сам понимаешь, предыдущее значение надо где-то запомнить, но с пременными SQL не работает. Вот и остается пропускать через него функцию. По другому я не представляю как можно зделать, даже чисто теоритически.
-------------------- библия учит любить ближнего, а камасутра обучает как именно |
|||
|
||||
| Лкшы |
|
|||
|
Unregistered |
За другие базы не знаю, в Interbase Update будет выглядеть так:
update TAB T1 set D1.DATA=(select T2.DATA from TAB T2 where T2.Num=(select max(T3.Num) from TAB T3 where T3.Num<T1.Num)) where T1.ID='BB' Результат получается как просили. Или я чего не понимяю? |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 14 Всего: 207 |
2 Лкшы - спасибо, похоже должно работать для многих баз данных, но к сожалению в MS Access не поддерживаются запросы вида:
Update Set MyField=(select...) -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
![]()
|
| Правила форума "Общие вопросы по базам данных" | |
|
|
Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:
Данный форум не предназначен для:
Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение.
Полезные советы: Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | СУБД, общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |