VadimirL
Участник
Offline
|
|
« : 27-07-2009 14:21 » |
|
Уважаемые Господа!
Подскажите пожалуйста, Как ввести конструкцию Select в Update в одном SQL запросе?
В моем случае база ругается: - “В операции должен использоваться обновляемый запрос”
У меня есть две таблицы Т1 и Т2. В Т1. поля: [Фамилия] и [Возраст], Все поля заполнены В Т2 такие - же поля, поле [Фамилия] - заполнно, а поле [Возраст] не заполнено. Ключевых полей в таблицах нет. Предполагается, что значения в полях : [Фамилия] в обоих таблицах не повторяются. Хотелось – бы перенести значение из поля Т1.[Возраст] в Т2.[Возраст]
|
|
|
Записан
|
|
|
|
VadimirL
Участник
Offline
|
|
« Ответ #1 : 27-07-2009 14:33 » |
|
Извините, не написал…
Т1 – это виртуальная таблица, полученная в конструкции Select, Т2-реальная
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #2 : 27-07-2009 14:35 » |
|
покажи твой запрос
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
VadimirL
Участник
Offline
|
|
« Ответ #3 : 27-07-2009 14:49 » |
|
UPDATE Т2 JOIN T1.[Здесь громадный Select, в котором есть AS T1 и поля Фамилия и Возраст-сам по себе он работает] ON T2.[Фамилия]=Т1.[Фамилия] SET T2.[Возраст]=Т1.[Возраст]
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #4 : 27-07-2009 19:05 » |
|
Неправильный синтаксис. Правильный синтаксис примерно такой: UPDATE T2 SET [Возраст] = T1.[Возраст] FROM T1 WHERE T1.[Фамлия] = T2.[Фамилия] P.S. На исполнение не проверял. Таблица после слова UPDATE - это целевая таблица, там не может быть запрос или объединение. Источники данных всегда указываются в секции FROM (если это не константы или не переменные).
|
|
« Последнее редактирование: 27-07-2009 19:07 от Dimka »
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
McZim
|
|
« Ответ #5 : 28-07-2009 07:27 » |
|
Создал тестовые таблицы create table iwuser.t1(name varchar2(20), age integer); create table iwuser.t2(name varchar2(20), age integer);
insert into iwuser.t1(name, age) values('Иванов',35); insert into iwuser.t1(name, age) values('Петров',45); insert into iwuser.t1(name, age) values('Сидоров',55);
insert into iwuser.t2(name) values('Иванов'); insert into iwuser.t2(name) values('Петров'); insert into iwuser.t2(name) values('Сидоров');
Заполнили UPDATE iwuser.t2 t2 SET t2.age = ( SELECT t1.age FROM iwuser.t1 t1 WHERE t1.name = t2.name)
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #6 : 28-07-2009 09:33 » |
|
McZim, проигрыш по производительности. На каждую обновляемую запись делается отдельный подзапрос.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
McZim
|
|
« Ответ #7 : 28-07-2009 09:44 » |
|
Dimka, о производительности речи не шло, я так понимаю это разовая процедура.
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
VadimirL
Участник
Offline
|
|
« Ответ #8 : 28-07-2009 10:25 » |
|
Уважаемые Господа! Отлично работает, если iwuser.t1 – реальная таблица, но если это (Select …Select…) – ругается “ В операции должен использоваться обновляемый запрос”, что-б ему… При этом сам (Select …Select…) - работает.
|
|
|
Записан
|
|
|
|
HandKot
Молодой специалист
Offline
|
|
« Ответ #9 : 28-07-2009 10:34 » |
|
Dimka показал как надо делать update t1 set [Возраст] = t.[Возраст] from (select * from ...) t where t1.[name] = t.[name] хотя, хотелось бы увидеть, что за сервер БД и версию
|
|
|
Записан
|
I Have Nine Lives You Have One Only THINK!
|
|
|
VadimirL
Участник
Offline
|
|
« Ответ #10 : 28-07-2009 10:59 » |
|
Этот проект я пытаюсь родить в MS ACCESS. (у меня больше ничего нет на эту тему, да и знаний на что-то другое не хватает). В VB:
1. Public Sub nExecuteSQL(CurConn As ADODB.Connection, SSQL As String) '// Подпрограмма для запуска запросов On Error Resume Next CurConn.Execute SSQL Randomize End Sub
2. // В функции:
Dim CurConn As ADODB.Connection Set CurConn = CurrentProject.Connection Dim SQQLTEXT As String Dim SQQLTEXT_1 As String Dim SQQLTEXT_2 As String // И вот в эту SQQLTEXT – SQL-запрос. // При этом Сама строка набирается с параметрами, которые пойдут в запрос // а сами строки собираются в один запрос в зависимости от ситуации.
SQQLTEXT_1 = SQQLTEXT_1 & " (" SQQLTEXT_1 = SQQLTEXT_1 & " SELECT" . . . SQQLTEXT= SQQLTEXT_1 & SQQLTEXT_2
// В конце SQQLTEXT = SQQLTEXT & ";"
//Запуск запроса на исполнение. Call nExecuteSQL(CurConn, SQQLTEXT)
Нудно это, но эффективно …
HandKot, а может подскажет мне чего-нибудь по теме "SQL запрос для обработки неструктурированной таблицы".
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #11 : 28-07-2009 11:27 » |
|
Отлично работает, если iwuser.t1 – реальная таблица, но если это (Select …Select…) – ругается “ В операции должен использоваться обновляемый запрос”, что-б ему… При этом сам (Select …Select…) - работает. Ещё раз: после слова UPDATE не может стоять запрос (точнее, сложный запрос). Поэтому совершенно правильно ругается. Давай задачу с самого начала. В том числе про длинный и сложный SELECT, результаты которого тебе зачем-то нужно обновить - вот это совершенно непонятно.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
VadimirL
Участник
Offline
|
|
« Ответ #12 : 28-07-2009 12:46 » |
|
Уважаемы Dimka!
Ваша беседа с Linless (в распечатаннм виде) стала для меня уж Родной! Я с ней засыпаю и просыпаюсь. Мне пришлось объяснять моей жене, что я понятия не имею, кто на самом деле Linless, но она не поверила…
iwuser.t1 – я приенил в соответствии с кодом г-на McZim в 5 ответе. Конечно-же (Select …Select…) я обновлять не собираюсь. Я пытаюсь взять него итоговые данные (3 поля) и занести эти данные в соответствующие поля другой-реальной таблицы - iwuser.t2(код г-на McZim, 5 ответ)
С уважением, Владимир.
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #13 : 28-07-2009 14:30 » |
|
VadimirL, приведи полный код неработающего запроса. (Если в оригинальном запросе содержится какая-то частная информация - упрости запрос до минимально неработоспособного состояния и поменяй в нём всё реальное на вымышленное.)
А то разговор ни о чём: тебе дают работающие каркасы, а ты говоришь. что не работает. Что не работает - совершенно непонятно.
P.S. Код на VBA тут к делу не относится - его приводить не надо.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
VadimirL
Участник
Offline
|
|
« Ответ #14 : 30-07-2009 06:21 » |
|
Уважаемый Dimka!
Благодарю Вас за сотрудничество.
Кажется, я разобрался.
В запросах SQL UPDATE в MS ACCESS не допускается использования конструкции SELECT … FROM.
Видимо, это связано с тем, что по логике SQL MS ACCESS результат запроса SELECT … FROM при выполнении UPDATE не хранится, а запускается заново – при этом может измениться его результат.
В MS ACCESS предлагается в самом запросе UPDATE в поля, предназначенные для обновления, вносить групповые операции с помощью специальных функций – они, возможно, оптимизируют процесс обновления.
Но это очень заумно…, проще создать временную реальную жесткую обычную промежуточную таблицу с помощью INSTER – результат SELECT … FROM и просто обновить поля в Базовой таблице.
С уважением, Владимир
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #15 : 30-07-2009 10:36 » |
|
проще создать временную реальную жесткую обычную промежуточную таблицу с помощью INSTER – результат SELECT … FROM и просто обновить поля в Базовой таблице. Да, можно так.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
|