Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SQL - предыдущее значение 
:(
    Опции темы
Vit
Дата 1.7.2003, 04:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
PM MAIL WWW ICQ   Вверх
Nastya
Дата 3.7.2003, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: нет
Всего: 44



Если поле с Id=bb стоит первым, какое занчение заносится в Date ?
Можно ли при решении задачи создавать промежуточные таблицы/запросы


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
Medved
Дата 4.7.2003, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 3
Всего: 154



Цитата
но интересно послушать есть ли решение и для других баз данных


PL/SQL - это можно сделать не напрягаясь, с помощью функции decode.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Cashey
Дата 4.7.2003, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Access я не знаю, но на FoxPro эта задача будет решаться так:
создается функция
Код

FUNCTION test
LPARAMETERS n
pMem=n
RETURN n


затем вызываем из программы

Код

PUBLIC pMem *объявляем публичную переменную
SELECT basetest *выбираем таблицу
GO top *переходим на первую запись
pMem = basetest.date *присваеваем переменной значение из первого поля
REPLACE date with; *вставляем
test(IIF(EMPTY(date),pMem,date));
all



--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
vickr
Дата 4.7.2003, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 13.5.2003
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Синтаксис SQL вряд ли позволит возвращать готовый результат в нужной форме. Необходимо изменять данные в процессе их отображения в форме - отслеживать событие Current, например, или как еще. С Access давненько не возился, но идея в голову приходит именно такая.
Vit
Если не получится - post here, можно будет подумать.
--------------------
Каждую секунду, тыкая в клавиши, мы давим насмерть не менее 1000 микробов =:)
PM MAIL   Вверх
Vit
Дата 8.7.2003, 06:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
PM MAIL WWW ICQ   Вверх
gray_k
Дата 8.7.2003, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1015
Регистрация: 9.1.2003
Где: Москва

Репутация: нет
Всего: 22



Насколько я знаю такое возможно в специализированных SQL (Oracle или MS-SQL). А стандартым запросом которые поддерживали бы все SQL-сервера скорее всего не получится. В Interbase такое не получится, так же как и в MySQL. Здесь надо писать хранимую процедуру. Причём для каждого сервера свою.


--------------------
С уважением.
Gray.
PM MAIL   Вверх
gray_k
Дата 8.7.2003, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1015
Регистрация: 9.1.2003
Где: Москва

Репутация: нет
Всего: 22



vit
Цитата
приходится программно проходить таблицы рекорд за рекордом, что мне не очень нравится

И какая разница в конце концов. Ведь такой запрос, который ты хочешь сделать ИМХО всё равно просмотрит все записи в таблице. В Interbase есть такая штука как план запроса. В нём показываются все действия над базой, которые делает запрос. НЕ знаю есть ли такое в MS-SQL, но если есть то посмотрев его по идее ты должен увидеть, что происходит полный перебор таблицы. Просто их надо оптимально проиндексировать.


--------------------
С уважением.
Gray.
PM MAIL   Вверх
Medved
Дата 8.7.2003, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 3
Всего: 154



ИМХО подругому никак.....


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Cashey
Дата 8.7.2003, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Vit, SQL-запрос по своей сути является циклом т.е. все равно бегает по всей базе и команда Update присваевает значение ячейке только той записи на которой находится. Сам понимаешь, предыдущее значение надо где-то запомнить, но с пременными SQL не работает. Вот и остается пропускать через него функцию. По другому я не представляю как можно зделать, даже чисто теоритически.


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
Лкшы
Дата 9.7.2003, 08:40 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
Дата 9.7.2003, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | СУБД, общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0535 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.