#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);