Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как ввести конструкцию Select в Update в одном SQL запросе?  (Прочитано 62973 раз)
0 Пользователей и 1 Гость смотрят эту тему.
VadimirL
Участник

ru
Offline Offline

« : 27-07-2009 14:21 » 

Уважаемые Господа!

Подскажите пожалуйста, Как ввести конструкцию Select в Update в одном SQL запросе?

В моем случае база ругается: - “В операции должен использоваться обновляемый запрос”

У меня есть две таблицы Т1 и Т2.
В Т1. поля: [Фамилия] и [Возраст], Все поля заполнены
В Т2 такие - же поля, поле [Фамилия] - заполнно, а поле [Возраст] не заполнено. Ключевых полей в таблицах нет.
Предполагается, что значения в полях : [Фамилия] в обоих таблицах не повторяются.
Хотелось – бы перенести значение из поля Т1.[Возраст] в Т2.[Возраст]
Записан
VadimirL
Участник

ru
Offline Offline

« Ответ #1 : 27-07-2009 14:33 » 

Извините, не написал…

Т1 – это виртуальная таблица, полученная в конструкции Select, Т2-реальная
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 27-07-2009 14:35 » 

покажи твой запрос
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
VadimirL
Участник

ru
Offline Offline

« Ответ #3 : 27-07-2009 14:49 » 

UPDATE Т2
   
JOIN T1.[Здесь громадный Select, в котором есть AS T1 и поля Фамилия и Возраст-сам по себе он работает]
   
ON  T2.[Фамилия]=Т1.[Фамилия]
   
SET T2.[Возраст]=Т1.[Возраст]
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 27-07-2009 19:05 » 

Неправильный синтаксис.

Правильный синтаксис примерно такой:
Код: (SQL)
UPDATE T2
SET [Возраст] = T1.[Возраст]
FROM T1
WHERE T1.[Фамлия] = T2.[Фамилия]

P.S. На исполнение не проверял. Таблица после слова UPDATE - это целевая таблица, там не может быть запрос или объединение. Источники данных всегда указываются в секции FROM (если это не константы или не переменные).
« Последнее редактирование: 27-07-2009 19:07 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #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
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 28-07-2009 09:33 » 

McZim, проигрыш по производительности. На каждую обновляемую запись делается отдельный подзапрос.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #7 : 28-07-2009 09:44 » 

Dimka, о производительности речи не шло, я так понимаю это разовая процедура.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
VadimirL
Участник

ru
Offline Offline

« Ответ #8 : 28-07-2009 10:25 » 

Уважаемые Господа!
Отлично работает, если iwuser.t1 – реальная таблица, но если это (Select …Select…) – ругается “ В операции должен использоваться обновляемый запрос”, что-б ему…
При этом сам (Select …Select…) - работает.
Записан
HandKot
Молодой специалист

ru
Offline 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
Участник

ru
Offline 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
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 28-07-2009 11:27 » 

Цитата: VladimirL
Отлично работает, если iwuser.t1 – реальная таблица, но если это (Select …Select…) – ругается “ В операции должен использоваться обновляемый запрос”, что-б ему…
При этом сам (Select …Select…) - работает.
Ещё раз: после слова UPDATE не может стоять запрос (точнее, сложный запрос). Поэтому совершенно правильно ругается.

Давай задачу с самого начала. В том числе про длинный и сложный SELECT, результаты которого тебе зачем-то нужно обновить - вот это совершенно непонятно.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
VadimirL
Участник

ru
Offline Offline

« Ответ #12 : 28-07-2009 12:46 » 

Уважаемы Dimka!

Ваша беседа с Linless (в распечатаннм виде)  стала для меня уж Родной! Я с ней засыпаю и просыпаюсь.
Мне пришлось объяснять моей жене, что я понятия не имею, кто на самом деле Linless, но она не поверила…

iwuser.t1 – я приенил в соответствии с кодом г-на McZim в 5 ответе.
Конечно-же (Select …Select…) я обновлять не собираюсь. Я пытаюсь взять него итоговые данные (3 поля) и занести эти данные в соответствующие поля другой-реальной таблицы - iwuser.t2(код г-на McZim, 5 ответ)

С уважением, Владимир.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 28-07-2009 14:30 » 

VadimirL, приведи полный код неработающего запроса. (Если в оригинальном запросе содержится какая-то частная информация - упрости запрос до минимально неработоспособного состояния и поменяй в нём всё реальное на вымышленное.)

А то разговор ни о чём: тебе дают работающие каркасы, а ты говоришь. что не работает. Что не работает - совершенно непонятно.

P.S. Код на VBA тут к делу не относится - его приводить не надо.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
VadimirL
Участник

ru
Offline 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
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 30-07-2009 10:36 » 

Цитата: VladimirL
проще создать временную реальную жесткую обычную промежуточную таблицу с помощью INSTER – результат SELECT … FROM и просто обновить поля в Базовой таблице.
Да, можно так.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines