powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / вложенный select в update
19 сообщений из 19, страница 1 из 1
вложенный select в update
    #37234987
Kyubi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброй ночи, форумчане!

Возник вопрос: access 2007 не понимает запросов на обновление с вложенным select-ом и "ссылками" на разные таблицы?

в частности, мой тестовый код:
Код: plaintext
1.
CurrentProject.Connection.Execute ("update книги set книги.текущее_количество=(select ostatok.ost from ostatok inner join книги on книги.код_книги=ostatok.код_книги)")

выдает ошибку: "В операции должен использоваться обновляемый запрос!"

как же мне тогда значения из одной таблицы в другую перекинуть? или может, у меня синтаксис неправильный?
помогите, любым советом!!!!!!
...
Рейтинг: 0 / 0
вложенный select в update
    #37234988
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kyubi,
Код: plaintext
1.
2.
3.
4.
CurrentProject.Connection.Execute _
"update (" & _
"ostatok inner join книги on книги.код_книги=ostatok.код_книги" & _
") as T" & _
" set текущее_количество=ost"
...
Рейтинг: 0 / 0
вложенный select в update
    #37234989
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kyubi,
или так
Код: plaintext
1.
2.
3.
CurrentProject.Connection.Execute _
"update" & _
" ostatok inner join книги on книги.код_книги=ostatok.код_книги" & _
" set книги.текущее_количество=ostatok.ost"
...
Рейтинг: 0 / 0
вложенный select в update
    #37235011
Kyubi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скукотища, в первом варианте он мне выдает ошибку синтаксиса update, во втором - все то же сообщение: "В операции должен использоваться обновляемый запрос!"

имхо с ХП на sql все было бы гораздо проще..

что-нибудь еще посоветуйте, пожалуйста.
...
Рейтинг: 0 / 0
вложенный select в update
    #37235033
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kyubi,
в первом варианте действительно ошибка синтаксиса,
надо:
Код: plaintext
1.
2.
3.
4.
"update select * from (" & _
"ostatok inner join книги on книги.код_книги=ostatok.код_книги" & _
") as T" & _
" set текущее_количество=ost"

Посоветовать могу выполнить запрос:
Код: plaintext
select код_книги,count(*) from ostatok goup by код_книги having count(*)> 1 ;
Если он вернет хотя бы одну запись - значит _возможен_ случай,
когда одной записи в таблице [книги] соответствует более одной записи в таблице [ostatok],
и обновление будет неоднозначным (читай - невозможным).
"Дубикаты" записей устранить, пробовать апдейт снова.
...
Рейтинг: 0 / 0
вложенный select в update
    #37235039
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kyubi,
в предидущем посте открывающую скобку в запросе не там поставил.
Надо перед select
Код: plaintext
1.
2.
3.
"update (select * from " & _
"ostatok inner join книги on книги.код_книги=ostatok.код_книги" & _
") As T set текущее_количество=ost"
ЗЫ: алиас для вложенного запроса - не обязателен
...
Рейтинг: 0 / 0
вложенный select в update
    #37235996
Kyubi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
дублей нет, да я и так знаю, что их нет (содержимое таблиц перед глазами), а этот долбанный access всё твердит, что запрос должен быть обновляемым.

прочитала на стороннем форуме, что в секции update "обновление можно делать только по данным одной таблицы" и что "в Access нельзя использовать подзапросы в команде UPDATE" бла-бла-бла "Access слишком упрощён".

может, он и правда настолько упрощен?

блин, ну, должен ведь быть способ обновить поле таблицы значениями из другой таблицы..
...
Рейтинг: 0 / 0
вложенный select в update
    #37236011
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй так
такая конструкция работает в MSSQL SERVER
может в аксесе что то аналогичное

Код: plaintext
1.
2.
UPDATE X set X.текущее_количество=A.ost
FROM книги X INNER JOIN ostatok A ON   X.код_книги=A.код_книги
...
Рейтинг: 0 / 0
вложенный select в update
    #37236029
Gwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, Access неважно работает с подзапросами..
А что Вам мешает просто выполнить два запроса подряд, то есть отдельно select и потом update на его результате?
...
Рейтинг: 0 / 0
вложенный select в update
    #37236056
ё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ё
Гость
Kyubiв частности, мой тестовый код:
Код: plaintext
1.
CurrentProject.Connection.Execute ("update книги set книги.текущее_количество=(select ostatok.ost from ostatok inner join книги on книги.код_книги=ostatok.код_книги)")

выдает ошибку: "В операции должен использоваться обновляемый запрос!"

в самомом "пиковом случае", раз уж всё "проистекает" в Акс-е, можно через DLookup
типа так
Код: plaintext
1.
2.
CurrentProject.Connection.Execute _
"update книги set текущее_количество=dlookup('ost','ostatok','код_книги=' & код_книги)"
...
Рейтинг: 0 / 0
вложенный select в update
    #37236138
Kyubi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ё, спасибо за идею, но возник вопрос:

Код: plaintext
1.
CurrentProject.Connection.Execute ("update книги set текущее_количество=dlookup('ost','ostatok','код_книги=' & код_книги)")

выдает ошибку: "Необходимо ввести значение в поле книги.текущее_количество"

при этом, если я переписываю это выражение как:

Код: plaintext
1.
CurrentProject.Connection.Execute ("update книги set текущее_количество=dlookup('ost','ostatok','код_книги=2')")

все успешно отрабатывается, только во все строки поля книги.текущее_количество подставляется, соответственно, одно и то же значение из ostatok.ost", где ostatok.код_книги=2

ВОПРОС: 'код_книги=??????' как в это выражение подставить книги.код_книги (если прям так и пишу 'код_книги=книги.код_книги' - выдает ошибку "Неизвестный")

что у меня не так с синтаксисом???
...
Рейтинг: 0 / 0
вложенный select в update
    #37236182
Kyubi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если так:
Код: plaintext
CurrentProject.Connection.Execute ("update книги set текущее_количество=dlookup('ost','ostatok','код_книги=код_книги')")
то все строки книги.текущее_количество обновляются первым значением ost из ostatok
...
Рейтинг: 0 / 0
вложенный select в update
    #37236198
Kyubi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
может, в цикл как-нибудь организовать????
...
Рейтинг: 0 / 0
вложенный select в update
    #37236216
ё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ё
Гость
Kyubiё, спасибо за идею, но возник вопрос:

Код: plaintext
1.
CurrentProject.Connection.Execute ("update книги set текущее_количество=dlookup('ost','ostatok','код_книги=' & код_книги)")

выдает ошибку: "Необходимо ввести значение в поле книги.текущее_количество"
это где выдаёт такую ошибку ? вы так как и написано - через код выполняли ?
выполните через построитель запросов - что будет ?

хотя, я вот щас проверил,
у меня это прекрасно отработало
Код: plaintext
1.
CurrentProject.Connection.Execute "update t2 set f2=dlookup('f2','t0','f1=' & f1)"
...
Рейтинг: 0 / 0
вложенный select в update
    #37236243
Kyubi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
через построитель запросов прекрасно отработало, правда, с оповещением, что невозможно обновить все записи, но все и не надо, а только те, где коды равны в обеих таблицах.

а вот в vba выдает ошибку и не выполняет, как же этот запрос в vba собрать?
...
Рейтинг: 0 / 0
вложенный select в update
    #37236254
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kyubiчерез построитель запросов прекрасно отработало, правда, с оповещением, что невозможно обновить все записи, но все и не надо, а только те, где коды равны в обеих таблицах.

а вот в vba выдает ошибку и не выполняет, как же этот запрос в vba собрать?

обратитесь в форум по акцесу, думаю там подскажут, что вы не так делаете.

PS
на вскидку, вы не так параметр передаёте скорее всего
...
Рейтинг: 0 / 0
вложенный select в update
    #37236319
Kyubi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вышла из ситуации через:
Код: plaintext
1.
CurrentDb.QueryDefs("fix_ostatok").SQL = "update книги set книги.текущее_количество=dlookup('ost','ostatok','код_книги=' & код_книги)"
DoCmd.OpenQuery ("fix_ostatok")

уфф, все получилось!

спасибо всем ОГРОМНОЕ!!!
...
Рейтинг: 0 / 0
вложенный select в update
    #37236479
ё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ё
Гость
Kyubiчерез построитель запросов прекрасно отработало, правда, с оповещением, что невозможно обновить все записи, но все и не надо, а только те, где коды равны в обеих таблицах.

а вот в vba выдает ошибку и не выполняет, как же этот запрос в vba собрать?
так в этом и была проблема, имхо
например - установлен запрет на НУЛЛ для поля книги.текущее_количество, а ДЛукап - возвращал НУЛЛ

тогда через ВБА - так можно
Код: plaintext
1.
Currentdb.Execute "update t2 set f2=nz(dlookup('f2','t0','f1=' & f1),0)"
или, если про нот нулл - я угадал, то
Код: plaintext
1.
CurrentProject.Connection.Execute "update t2 set f2=nz(dlookup('f2','t0','f1=' & f1),0)"
...
Рейтинг: 0 / 0
вложенный select в update
    #37490981
Mara88
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Делюсь опытом, столкнулся на такую же проблему, БД на access, ПРОБЛЕМА РЕШЕНА следующим методом:
есть 2 таблицы: stari, novi с одинаковыми полями ves, n. Необходимо обновить записи таблицы stari поля ves, где совпадают значения поля n обеих таблиц.

UPDATE (
SELECT stari.ves AS stari_ves, novi.ves AS novi_ves
FROM stari, novi
WHERE stari.n = novi.n )
SET stari_ves = novi_ves

До выполнения запроса:
stari
---------
n | ves|
001 | 20 |
002 | 20 |
025 | 00 |

novi
---------
n | ves|
011 | 11 |
025 | 77 |
033 | 11 |

После выполнения запроса:
stari
---------
n | ves|
001 | 20 |
002 | 20 |
025 | 77 |
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / вложенный select в update
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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