PLSQL Merge удалить - PullRequest
       14

PLSQL Merge удалить

1 голос
/ 07 декабря 2011

Я пытаюсь объединить две таблицы, используя инструкцию MERGE, есть ли способ удалить записи в объединенной таблице, которые не были сопоставлены или обновлены?

логика это: если соответствует, оставь это. если не совпадает в исходном удалении. если не совпадает в целевой вставке.

Я знаю, что в SQL есть соответствие источника / цели, есть ли в Oracle что-нибудь подобное?

Ответы [ 3 ]

2 голосов
/ 07 декабря 2011

Насколько я знаю, для этого нет (один выстрел) SQL.

В PL / SQL вы можете сделать это, например, таким (каким-то некрасивым) способом:

BEGIN

FOR r in (select a1,a2,b1,b2,b.rowid from a full outer join b on a.a1=b.b1)
loop

  if r.a1 is null 
  then 
     delete from b where rowid=r.rowid;
  end if;

  if r.b1 is null
  then 
     insert into b values (r.a1, r.a2);
  end if;

end loop;
END;
0 голосов
/ 07 декабря 2011

Если вы используете хотя бы Oracle 10g, в операторе MERGE есть предложение DELETE WHERE.

Но, как и в случае с AB Cade, я не уверенчто я понимаю какие строки ты пытаешься удалить.Если вы пытаетесь удалить строки из целевой таблицы, которых нет в источнике, что делает MERGE большей синхронизацией, чем слиянием, вы можете сделать DELETE WHERE NOT EXISTS.Но если это и есть цель, я бы сделал шаг назад и посмотрел бы на проблему, потому что, похоже, существует лучший технический подход к любой вашей бизнес-проблеме.Если вы пытаетесь синхронизировать две таблицы, вы обычно либо выполняете репликацию, и в этом случае вам следует использовать технологии репликации Oracle, такие как материализованные представления и потоки, или вам не нужно иметь две копии данных, во-первых, и одну.копия должна быть просто представлением или синонимом, который ссылается на другое.

0 голосов
/ 07 декабря 2011

Я не совсем понимаю: допустим, у вас есть таблица A и таблица B, и, допустим, вы хотите объединить B с A согласно некоторому идентификатору col, хотите ли вы, чтобы каждая строка в A имела такой же идентификаторB не будет изменен, и каждая строка в A, которая не существует в B (согласно ID), будет удалена, но каждая строка в B, которая не существует в A, будет добавлена ​​к A?Если это так, не означает ли это, что вы хотите объединить А с В (но поменять таблицу А)?Почему бы не скопировать таблицу B в другую таблицу C, затем объединить A в C и переместить данные обратно в A?

...