Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Update одной строкой (из чистого любопытства) / 23 сообщений из 23, страница 1 из 1
24.05.2004, 13:30
    #32530594
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update одной строкой (из чистого любопытства)
На этом форуме часто обсуждаются вопросы, как сделать хитрый селект одной строкой. А у меня вопрос по апдейту. Апдейт, как известно, требует обновляемого запроса и тем самым усложняет задачу.

Задаю этот вопрос из чистого любопытства - я сам эту проблему обошел, хотя и не самым красивым образом. Мне просто интересно, разрешимо ли это.

Итак, вот постановка:

Дана таблица T:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
id vv
 1   трампампам
 2 
 3 
 4 
 5   ляляля
 6 
 7 
 8 

Надо заполнить поле vv везде, где оно не заполнено, следующим образом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
id vv
 1   трампампам
 2   трампампам
 3   трампампам
 4   трампампам
 5   ляляля
 6   ляляля
 7   ляляля
 8   ляляля

То есть для каждого id, где isnull(vv), надо взять максимальное id из меньших данного, но где not isnull(vv), и его vv занести в данную запись.

Если надо, то существует отдельная вспомогательная таблица U, построенная на основе T:
Код: plaintext
1.
2.
id vv
 1   трампампам
 5   ляляля

Спасибо всем, кто согласится это обсудить.
...
Рейтинг: 0 / 0
24.05.2004, 13:40
    #32530625
vlad_707
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update одной строкой (из чистого любопытства)
В.С. ты мой топик читал..., но всё таки мне кажется, что твой вопрос- аналог моему....
/topic/92324&pg=1#682955

из которого я нашёл решения только через временную таблицу..., хотя на sql сервере всё работает через 1 запрос. (у меня было 3 варианта работающих на серваке и только 1 на аксессе...)
...
Рейтинг: 0 / 0
24.05.2004, 13:41
    #32530630
Bely
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update одной строкой (из чистого любопытства)
Смотря какая БД.
Если чистый Access, то должно работать

Код: plaintext
1.
2.
3.
4.
UPDATE MyTbl t1
SET
 vv = (SELECT t2.vv FROM MyTbl t2 WHERE t2.ID = (SELECT MAX(t3.ID) FROM MyTBL t3 WHERE t3.ID < t1.ID AND t3.vv is NOT NULL ))
WHERE t1.vv is NULL

Идея вот такая...

Будет ли работать под MS-SQL - не знаю.
Под Oracle - точно будет :)
...
Рейтинг: 0 / 0
24.05.2004, 13:52
    #32530661
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update одной строкой (из чистого любопытства)
Да, действительно. Группировки нет. Спасибо!!!
...
Рейтинг: 0 / 0
24.05.2004, 14:38
    #32530772
(c)VIG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update одной строкой (из чистого любопытства)
Да, действительно. Группировки нет. Спасибо!!!
Но тем не менеe, работать в Акссес не будет. (:
...
Рейтинг: 0 / 0
24.05.2004, 14:39
    #32530775
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update одной строкой (из чистого любопытства)
Почему?
...
Рейтинг: 0 / 0
24.05.2004, 14:43
    #32530787
(c)VIG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update одной строкой (из чистого любопытства)
Потому что это Access (:
Трудно проверить?
...
Рейтинг: 0 / 0
24.05.2004, 14:47
    #32530798
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update одной строкой (из чистого любопытства)
У меня база не при себе... А все-таки? В чем проблема? В том, что слишком большой уровень вложенности?
...
Рейтинг: 0 / 0
24.05.2004, 14:50
    #32530816
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update одной строкой (из чистого любопытства)
2 Саныч
Синтаксис Update d Ассеыы - скажем так - необычный
а) в инструкции Set - то, что может быть проинтерперетировано как вычисляемое выражение. Функции подмножеств D допустимы, подзапросы в явном виде - нет.

То есть проще всего с DMax-ом колдовать, хотя, может быть и придумается что-то другое.
...
Рейтинг: 0 / 0
24.05.2004, 14:53
    #32530820
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update одной строкой (из чистого любопытства)
авторВ том, что слишком большой уровень вложенности?

в другом - глупый аксесс считает такой запрос необновляемым ему для обновляемости подавай иннер джоин результата с вычисляемым выражением
...
Рейтинг: 0 / 0
24.05.2004, 14:57
    #32530826
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update одной строкой (из чистого любопытства)
То есть получается, что это в Аксессе одной строкой не сделать?
...
Рейтинг: 0 / 0
24.05.2004, 15:12
    #32530872
CtrlAlt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update одной строкой (из чистого любопытства)
Можно вот так, к примеру (проверил, работает):

Код: plaintext
1.
2.
UPDATE T, T AS T_1 SET T.vv = [T_1].[vv]
WHERE (((T.vv) Is Null) AND ((T.id)>[T_1].[id]) AND (Not (T_1.vv) Is Null));

Правда не самый оптимальный способ, но если подумать можно его улучшить.
...
Рейтинг: 0 / 0
24.05.2004, 15:16
    #32530877
zz
zz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update одной строкой (из чистого любопытства)
взять решение Bely, правую часть после SET w= засунуть в функцию, парметром фунции - MyTbl.id
...
Рейтинг: 0 / 0
24.05.2004, 15:17
    #32530879
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update одной строкой (из чистого любопытства)
2 CtrlAlt:

Увы, это неверно. Вот это:

((T.id)>[T_1].[id])

не учитывает, что имеется несколько таких [T_1].[id] и из них надо брать максимальное.
...
Рейтинг: 0 / 0
24.05.2004, 15:18
    #32530883
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update одной строкой (из чистого любопытства)
Функцию - это уже отступление от постановки задачи. Хотелось чистым SQL'ем...
...
Рейтинг: 0 / 0
24.05.2004, 15:22
    #32530892
CtrlAlt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update одной строкой (из чистого любопытства)
Увы, это неверно

А по моему верно. Дело в том что некоторые значения будут перезаписываться по нескольку раз (я это имел ввиду про неоптимальность), но в конце - концов проапдейтятся максимальным значением.
...
Рейтинг: 0 / 0
24.05.2004, 15:33
    #32530905
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update одной строкой (из чистого любопытства)
А где гарантия, что правильный будет последним?
...
Рейтинг: 0 / 0
24.05.2004, 16:40
    #32531097
CtrlAlt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update одной строкой (из чистого любопытства)
Тогда вот:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
UPDATE DISTINCTROW T, T AS T_1, 

[SELECT Max(T.id) AS I1, T_1.id AS I2
FROM T, T AS T_1
WHERE T.id<T_1.id AND T.vv Is Not Null AND T_1.vv Is Null
GROUP BY T_1.id
]. AS T_2 

SET T.vv = [T_1].[vv]
WHERE (((T_1.id)=[I1]) AND ((T.id)=[I2]));

Только если открыть в конструкторе и сохранить, Access ломает запрос и он перестает работать...
Если нет такой необходимости решить одним запросом, можно среднюю часть сохранить в отдельный запрос.
...
Рейтинг: 0 / 0
24.05.2004, 17:26
    #32531215
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update одной строкой (из чистого любопытства)
Но тогда появляется группировка и запрос становится необновляемым. :^)
...
Рейтинг: 0 / 0
24.05.2004, 17:38
    #32531250
CtrlAlt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update одной строкой (из чистого любопытства)
Предже чем постить, я обычно проверяю работоспособность.
Запрос который я привел работает. Он обновляемый. Помогает DISTINCTROW
...
Рейтинг: 0 / 0
24.05.2004, 17:41
    #32531255
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update одной строкой (из чистого любопытства)
Понял, прошу прощения. Про DISTINCTROW не знал, что оно влияет на обновляемость. А почему так происходит?
...
Рейтинг: 0 / 0
24.05.2004, 17:52
    #32531274
CtrlAlt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update одной строкой (из чистого любопытства)
Я и сам не знал. Где-то на этом форуме и прочитал :)
...
Рейтинг: 0 / 0
24.05.2004, 18:02
    #32531287
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update одной строкой (из чистого любопытства)
ОК. Спасибо! :^)
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Update одной строкой (из чистого любопытства) / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]