2016-10-05 13 views
1

Я новичок в Oracle SQL, и я пытаюсь сделать обновление таблицы со следующим контекстом:Невозможно продлить временный сегмент на 128 в табличном пространстве TEMP. Другой вариант выполнения этого запроса?

У меня есть таблица А:

+---------+---------+---------+----------+ 
| ColumnA | name | ColumnC | Column H | 
+---------+---------+---------+----------+ 
| 1  | Harry | null | null  | 
| 2  | Harry | null | null  | 
| 3  | Harry | null | null  | 
+---------+---------+---------+----------+ 

И таблицу B:

+---------+---------+---------+ 
| name | ColumnE | ColumnF | 
+---------+---------+---------+ 
| Harry | a  | d  | 
| Ron  | b  | e  | 
| Hermione| c  | f  | 
+---------+---------+---------+ 

И я хочу, чтобы обновить таблицу А так, что результат будет следующий:

+---------+---------+---------+----------+ 
| ColumnA | name | ColumnC | Column H | 
+---------+---------+---------+----------+ 
| 1  | Harry | a  | d  | 
| 2  | Harry | a  | d  | 
| 3  | Harry | a  | d  | 
+---------+---------+---------+----------+ 

У меня проблема с предложением Oracle SQL. У меня есть следующий контекст:

merge into tableA a 
using tableB b 
on (a.name=b.name) 
when matched then update set 
columnC = b.columnE, 
columnH = b.columnF 


create table tableA (columnC varchar2(20), columnH varchar2(20), name varchar2(20), columnA number); 
create table tableB (columnE varchar2(20), columnF varchar2(20), name varchar2(20)); 
insert into tableA values (null, null,'Harry',1); 
insert into tableA values (null, null,'Harry',3); 
insert into tableA values (null, null,'Harry',3); 
insert into tableB values ('a', 'd','Harry'); 
insert into tableB values ('b', 'e','Ron'); 
insert into tableB values ('c', 'f','Hermione'); 
select * from tableA; 
merge into tableA a 
using tableB b 
on (a.name=b.name) 
when matched then update set 
columnC = b.columnE, 
columnH = b.columnF; 
select * from tableA; 

Проблема заключается в том, что я получаю следующую ошибку, когда я выполнить эту команду:

Error: ORA-01652: unable to extend temp segment by 128 in tablespace TEMP

Я не могу дать больше пространства для TEMP табличного пространства. Итак, мой вопрос: есть ли возможность использовать другой SQL-запрос, который не использует табличное пространство TEMP?

+1

Из любопытства, почему вы не можете увеличить табличное пространство TEMP? У вас не хватает места на сервере или что-то еще и физически не может добавить к нему больше? Или это откат от ваших администраторов баз данных или что-то еще? Поскольку IMO, если ваша система должна иметь возможность запускать хорошо настроенный запрос, который потребляет 12 ГБ временного табличного пространства, тогда ему требуется табличное пространство temp, которое составляет не менее 12 ГБ. Только для одноразовых, специальных запросов, которые я бы не стал требовать, чтобы мои администраторы баз данных добавляли дополнительное временное табличное пространство. – Boneist

ответ

2

вы можете попробовать следующий запрос, возможно, он будет потреблять меньше TEMP табличным:

update tableA 
set (columnC, columnH) = (select ColumnE, ColumnF from tableB where tableB.name = tableA.name) 
where 
    tableA.name in (select tableB.name from tableB) 
; 

Или вы можете попробовать выполнить обновление в небольших кусках в цикле. Это менее перфоманс, но если у вас нет другого пути ...

begin 
     FOR rec in 
     (select name, ColumnE, ColumnF from tableB) 
     LOOP 
     update tableA 
     set 
     columnC = rec.columnE 
     , columnH = rec.columnF 
     where name = rec.name 
     ; 
     end loop; 
    end; 
/
+0

Я попробую это через минуту, и я прокомментирую результаты. Спасибо за быстрый ответ! – jartymcfly

+0

Это сработало! Спасибо! – jartymcfly