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

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

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

Дана таблица 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
Update одной строкой (из чистого любопытства)
    #32530625
vlad_707
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В.С. ты мой топик читал..., но всё таки мне кажется, что твой вопрос- аналог моему....
/topic/92324&pg=1#682955

из которого я нашёл решения только через временную таблицу..., хотя на sql сервере всё работает через 1 запрос. (у меня было 3 варианта работающих на серваке и только 1 на аксессе...)
...
Рейтинг: 0 / 0
Update одной строкой (из чистого любопытства)
    #32530630
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотря какая БД.
Если чистый 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
Update одной строкой (из чистого любопытства)
    #32530661
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Да, действительно. Группировки нет. Спасибо!!!
...
Рейтинг: 0 / 0
Update одной строкой (из чистого любопытства)
    #32530772
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, действительно. Группировки нет. Спасибо!!!
Но тем не менеe, работать в Акссес не будет. (:
...
Рейтинг: 0 / 0
Update одной строкой (из чистого любопытства)
    #32530775
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Почему?
...
Рейтинг: 0 / 0
Update одной строкой (из чистого любопытства)
    #32530787
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что это Access (:
Трудно проверить?
...
Рейтинг: 0 / 0
Update одной строкой (из чистого любопытства)
    #32530798
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
У меня база не при себе... А все-таки? В чем проблема? В том, что слишком большой уровень вложенности?
...
Рейтинг: 0 / 0
Update одной строкой (из чистого любопытства)
    #32530816
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Саныч
Синтаксис Update d Ассеыы - скажем так - необычный
а) в инструкции Set - то, что может быть проинтерперетировано как вычисляемое выражение. Функции подмножеств D допустимы, подзапросы в явном виде - нет.

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

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

Код: 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
Update одной строкой (из чистого любопытства)
    #32530877
zz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
взять решение Bely, правую часть после SET w= засунуть в функцию, парметром фунции - MyTbl.id
...
Рейтинг: 0 / 0
Update одной строкой (из чистого любопытства)
    #32530879
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
2 CtrlAlt:

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

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

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

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

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


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