Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Update на основе Select  [new]
CrazyDiamond
Member

Откуда: Москва
Сообщений: 158
Есть некий селект, возвращающий
(имя_столбца, старое_значение, новое_значение)

Я могу НЕ писать

SELECT 'UPDATE таблица SET имя_столбца = ' || новое_значение || ' WHERE имя_столбца = ' || старое_значение || '; '

а решить эту задачу как-то изящьнее?
У меня стопицот таких строк апдейтов...
15 окт 10, 13:01    [9613485]     Ответить | Цитировать Сообщить модератору
 Re: Update на основе Select  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6731
CrazyDiamond,

например, создать таблицу (коллекцию) соответствий (ключ, старое значение, новое значение)
15 окт 10, 13:03    [9613503]     Ответить | Цитировать Сообщить модератору
 Re: Update на основе Select  [new]
CrazyDiamond
Member

Откуда: Москва
Сообщений: 158
Забыл: Oracle 9i, AIX
15 окт 10, 13:03    [9613511]     Ответить | Цитировать Сообщить модератору
 Re: Update на основе Select  [new]
CrazyDiamond
Member

Откуда: Москва
Сообщений: 158
env,
... а потом?
15 окт 10, 13:05    [9613525]     Ответить | Цитировать Сообщить модератору
 Re: Update на основе Select  [new]
SQLap
Member [заблокирован]

Откуда:
Сообщений: 34063
CrazyDiamond
У меня стопицот таких строк апдейтов...


Вынести реализацию нового значения из select в update
15 окт 10, 13:19    [9613651]     Ответить | Цитировать Сообщить модератору
 Re: Update на основе Select  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6731
CrazyDiamond,

update (select ...)

merge

update set = (select ...)
where exists (select ...)
15 окт 10, 13:28    [9613742]     Ответить | Цитировать Сообщить модератору
 Re: Update на основе Select  [new]
CrazyDiamond
Member

Откуда: Москва
Сообщений: 158
Я не совсем понимаю, что предлагается. Можно пример?

Мы же не можем написать:

CREATE TABLE for_update AS
   (SELECT имя_столбца, старое_значение, новое_значение FROM ...)
UPDATE real_table
SET имя_столбца = for_update.новое_значение
WHERE имя_столбца = for_update.старое_значение
15 окт 10, 13:29    [9613752]     Ответить | Цитировать Сообщить модератору
 Re: Update на основе Select  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9264
Почему, можем ))) Динамический SQL:

DBMS_SQL package
Execute Immediate
15 окт 10, 13:30    [9613770]     Ответить | Цитировать Сообщить модератору
 Re: Update на основе Select  [new]
CrazyDiamond
Member

Откуда: Москва
Сообщений: 158
Нет, так как я написал выше, мы действительно сделать не можем.

Можем сделать вот так!:)
CREATE TABLE tmp_to_upd AS 
   (SELECT 'AAA' AS cha, 7 AS dig FROM dual UNION ALL
    SELECT 'BBB' AS cha, 0 AS dig FROM dual UNION ALL
    SELECT 'CCC' AS cha, 15 AS dig FROM dual UNION ALL
    SELECT 'DDD' AS cha, -5 AS dig FROM dual);

CREATE TABLE tmp_new_vals AS 
   (SELECT 'AAA' AS cha, 3 AS dig FROM dual UNION ALL
    SELECT 'BBB' AS cha, 2 AS dig FROM dual UNION ALL
    SELECT 'CCC' AS cha, 1 AS dig FROM dual);

UPDATE tmp_to_upd o
SET o.dig = (SELECT n.dig FROM tmp_new_vals n WHERE n.cha = o.cha)
WHERE o.cha IN (SELECT cha FROM tmp_new_vals)
15 окт 10, 13:57    [9614082]     Ответить | Цитировать Сообщить модератору
 Re: Update на основе Select  [new]
CrazyDiamond
Member

Откуда: Москва
Сообщений: 158
PS: как воспользоваться предложенными тут вариантами (merge и execute immediate) я так и не понял.
Причем тут вообще execute immediate?
Afaik, он применяется для выполнения update/select/insert, указанного в char переменной в pl/sql коде.
15 окт 10, 13:59    [9614115]     Ответить | Цитировать Сообщить модератору
 Re: Update на основе Select  [new]
Добрый Э - Эх
Guest
CrazyDiamond
Есть некий селект, возвращающий
...
решить эту задачу как-то изящьнее?

1) Делай UPDATE по верх твоего селекта.
2) Если оракл откажется делать такое, попробуй вывернуть ему руки.

-- 1)
update (твой запрос)
   set имя_столбца = новое_значение;

-- 2)
update /*+ BYPASS_UJVC*/ (твой запрос)
   set имя_столбца = новое_значение;
18 окт 10, 06:13    [9623775]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить