2013-05-14 5 views
0

В Oracle 10g, я хочу, чтобы обновить записи результирующего минус запроса ниже:ORACLE Update с МИНУС результата

(
SELECT A,B,C FROM Table1 

    MINUS 

SELECT A,B,C FROM Table2 
) 

Столбец, который должен быть обновлен, не является частью минус запроса, как его нет в обеих таблицах, поэтому ниже код не вариант

UPDATE 
(
SELECT A,B,C FROM Table1 

    MINUS 

SELECT A,B,C FROM Table2 
) 
SET TABLE1.D = 'TEST' 

ответ

1

Как насчет:

update table1 
    set d = 'TEST' 
where (a,b,c) not in(select a,b,c from table2); 

Редактировать: Производительность минус обычно сосать из-за операции сортировки. Если какой-либо из {a,b,c} являются обнуляемым, попробуйте следующее вместо:

update table1 t1 
    set t1.d = 'TEST' 
where not exists(
     select 'x' 
      from table2 t2 
      where t2.a = t1.a 
      and t2.b = t1.b 
      and t2.c = t1.c 
     ); 
+0

Это работает. Это, однако, очень мало производительности по сравнению с тем, как быстро MINUS получает различия. – Joel

+0

Оба решения работают. Я ищу реализацию с использованием MINUS. Я тестировал его быстрее, чем WHERE (a, b, c) не в (выберите a, b, c) и проще реализовать, чем не существует решение для таблиц с большим количеством столбцов. – Joel

+0

До сих пор я собираюсь с выпуском NOT IN, который вы опубликовали. – Joel

1

В ответ на ваш комментарий о желании использовать пункт minus:

update Table1 
    set d = 'TEST' 
    where (a,b,c) in (select a,b,c from Table1 minus select a,b,c from Table2); 
Смежные вопросы