Как избежать дублирования строк при вставке из одной таблицы в другую с помощью Oracle SQL?

#sql #oracle #subquery #sql-insert

#sql #Oracle #подзапрос #sql-вставка

Вопрос:

У меня есть две таблицы со следующей структурой :

TABLE_A

 id_a|name_a|identifier_a
1   |toto  |uuuu
2   |titi  |oooo
3   |tutu  |vvvv  
  

TABLE_B

 id_b|name_b|identifier_b
1   |toto  |uuuu
11  |tyty  |tttt
56  |tetu  |bbbb  
  

Я пытаюсь вставить данные из TABLE_B в TABLE_B без повторяющихся строк, используя столбец идентификатора. Итак, ожидаемый результат должен быть :

 id_a|name_a|identifier_a
1   |toto  |uuuu
2   |titi  |oooo
3   |tutu  |vvvv
11  |tyty  |tttt
56  |tetu  |bbbb
  

Следующий запрос для этого :

 INSERT INTO TABLE_A(ID_A, NAME_A, IDENTIFIER_A)
SELECT ID_B, NAME_B, IDENTIFIER_B 
FROM TABLE_B
WHERE NOT EXISTS (SELECT IDENTIFIER_A FROM TABLE_A);
  

Но я получаю сообщение об ошибке, в котором говорится, что столбец недействителен (???) :

 SQL Error : ORA-00904: "IDENTIFIER_B" : 00904. 00000 -  "%s: invalid identifier"
  

У вас есть идеи получше, чтобы сделать эту вставку?

Ответ №1:

MERGE Для этой цели можно использовать инструкцию — вставлять только строки, которых нет в целевой таблице.

Проверьте документацию — оператор MERGE также может обновлять существующие строки

 MERGE INTO TABLE_B b
USING TABLE_A a
ON (a.id_a = b.id_b)
WHEN NOT MATCHED THEN INSERT (id_b, name_b, identifier_b)
  VALUES (id_a, name_a, identifier_a)
  

Ответ №2:

Сообщение об ошибке достаточно ясно: в таблице нет столбца, вызываемого identifier_b b . Вам необходимо использовать правильное имя столбца.

Однако позвольте мне указать, что ваш запрос не выполняет то, что вы хотите: вам нужно сопоставить EXISTS подзапрос, иначе никакие строки никогда не будут вставлены (если table_a только они не пусты для начала).

Я думаю, что логика, которую вы хотите:

 insert into table_a(id_a, name_a, identifier_a)
select id_b, name_b, identifier_b 
from table_b b
where not exists (select 1 from table_a a where a.identifier_a = b.identifier_b);