Обновление с помощью запроса на присоединение в Oracle - PullRequest
0 голосов
/ 18 июля 2011

что не так в запросе? (выполняется бесконечно)

UPDATE table1 t1 SET (t1.col,t1.Output) = (
  SELECT t2.col, t3.Output + t2.col
  FROM tabl2 t3 
  LEFT JOIN table1 t2 ON t3.Join_Key = t2.Join_Key
  WHERE t2.col is not NULL);

Пожалуйста, помогите мне.

Ответы [ 2 ]

4 голосов
/ 18 июля 2011

Если ваш подзапрос SELECT не возвращает одну строку, ваш оператор UPDATE должен завершиться ошибкой

ORA-01427: single-row subquery returns more than one row

Как правило, если у вас есть коррелированное обновление, вам нужно условие, которое связывает строки во внешней таблице T1 со строками во внутреннем подзапросе, чтобы подзапрос возвратил одну строку. Это будет выглядеть примерно так:

UPDATE table1 t1 SET (t1.col,t1.Output) = (
  SELECT t2.col, t3.Output + t2.col
  FROM tabl2 t3 
  LEFT JOIN table1 t2 ON t3.Join_Key = t2.Join_Key
  WHERE t2.col is not NULL
    AND t1.some_key = t2.some_key);

Наконец, этот оператор UPDATE обновляет каждую строку в T1. Это то, что вы намерены? Или вы хотите обновить только те строки, где, например, вы нашли совпадение в своем подзапросе?

2 голосов
/ 18 июля 2011

Ваш запрос не имеет большого смысла с общими ссылками на table1, table2 и join_key.

Если это не то, что вы ищете, было бы полезно иметь некоторые примеры данных, чтобы лучше понять, какие результаты вы ищете.

update table1 t1
   set t1.col = (select t2.col
                 from table2 t2
                 where  t1.join_key = t2.join_key(+)  
                  and  t1.col is not null),
       t1.output = (select t2.output + t1.col
                    from  table2 t2
                   where  t1.join_key = t2.join_key(+)  
                     and  t1.col is not null);
...