Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
 UPDATE с объединением  [new]
mwolf
Member

Откуда: Харьков
Сообщений: 600
Запрос в принципе простой

В MS SQL-е это было бы так
UPDATE t1
SET t1.name = t2.name
FROM table1 t1, table t2
WHERE t1.id = t2.fk_id 

То есть мне надо проапдейтить таблицу t1 значениями из t2 при совпадении ИД

Как подобное делается в DB2?
21 ноя 08, 18:57    [6473877]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE с объединением  [new]
mustaccio
Member

Откуда: Москва -> Торонто
Сообщений: 494
UPDATE t1
SET t1.name = (select t2.name FROM table1 t1, table t2 WHERE t1.id = t2.fk_id)

Стандарт SQL92
21 ноя 08, 19:41    [6474023]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE с объединением  [new]
mustaccio
Member

Откуда: Москва -> Торонто
Сообщений: 494
mustaccio,

Ошибочка вышла

UPDATE t1
SET t1.name = (select t2.name FROM table t2 WHERE t1.id = t2.fk_id)
конечно же.
21 ноя 08, 19:42    [6474026]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE с объединением  [new]
mwolf
Member

Откуда: Харьков
Сообщений: 600
mustaccio
mustaccio,

Ошибочка вышла

UPDATE t1
SET t1.name = (select t2.name FROM table t2 WHERE t1.id = t2.fk_id)
конечно же.


Оно, конечно, да, но есть один момент.
Если делать джоин как в моём примере, то в таблице проапдейтится 10 строк из 10 000.
В вашем примере база будет пытаться проапдейтить все 10к строк, постоянно натыкаясь на отсутствие соответствий.

Так что хотелось бы этот момент обойти. Или ДБ2 достаточно умная и, чтоб соптимизировать этот запрос?
21 ноя 08, 20:31    [6474150]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE с объединением  [new]
mustaccio
Member

Откуда: Москва -> Торонто
Сообщений: 494
Запрос будет делать то, что в нем написано, и оптимизация тут вовсе ни при чем. Если вам нужно выбрать записи в Т1 по какому-то критерию, этот критерий должен быть указан в кляузе WHERE. Согласно тому же стандарту.

UPDATE t1
SET t1.name = (select t2.name FROM table t2 WHERE t1.id = t2.fk_id)
where exists (select 1 FROM table t2 WHERE t1.id = t2.fk_id)
21 ноя 08, 20:42    [6474180]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE с объединением  [new]
TORT
Member

Откуда:
Сообщений: 1095
Ну если без стандартов, то оператор merge поможет...
22 ноя 08, 11:40    [6475079]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE с объединением  [new]
mwolf
Member

Откуда: Харьков
Сообщений: 600
TORT
Ну если без стандартов, то оператор merge поможет...


О!
Кажется оно
MERGE INTO table1 t1
  USING table t2
  ON t1.id = t2.fk_id 
  WHEN MATCHED THEN
     UPDATE SET t1.name = t2.name

Я правильно понимаю происходящее?

2 mustaccio
>>Запрос будет делать то, что в нем написано, и оптимизация тут вовсе ни при чем
Оно, конечно, так, но когда пишешь что-то реальное, то оптимизация становится очень даже причём.
С ДБ2 я работаю немного, поэтому оптимизатор этой СУБД меня очень даже интересует.
Оптимизатор MS SQL вполне мог начать делать по 2 запроса на каждую из строк в Т1 в вашем запросе
А вот мой запрос, который я приводил в качестве примера, отрабатывает хорошо.
24 ноя 08, 14:18    [6480061]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE с объединением  [new]
TORT
Member

Откуда:
Сообщений: 1095
По-моему для Вашей задачи merge самое то... Там правда есть различные ограничения по его использованию, ну это Вам лучше в доку глянуть....
24 ноя 08, 16:28    [6480882]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE с объединением  [new]
Dune
Guest
MERGE INTO table1 t1
USING table t2
ON t1.id = t2.fk_id
WHEN MATCHED THEN
UPDATE SET t1.name = t2.name
ELSE IGNORE;
24 ноя 08, 17:24    [6481276]     Ответить | Цитировать Сообщить модератору
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить