следующие работы:PL/SQL вставки с использованием нескольких выбирает и минус оператор
INSERT INTO BASE_TABLE
(
req,
desc,
ver
)
SELECT * FROM UPDATE_TABLE
minus
SELECT req, desc, ver FROM BASE_TABLE;
Однако это приводит к ошибке (просто пытается вставить еще одно поле: «ключ»):
INSERT INTO BASE_TABLE
(
req,
desc,
ver,
key
)
SELECT * FROM UPDATE_TABLE
minus
SELECT req, desc, ver FROM BASE_TABLE,
SELECT CONCAT(req, ver) FROM UPDATE_TABLE;
Ошибка:
PL/SQL: ORA-00903: неверное имя таблицы
Попытка вставить строки в BASE_TABLE, выбирая все из таблицы UPDATE, которая уже не находится в BASE_TABLE. Просто хотел добавить поле «ключ».
Последний SELECT кажется неуместным и вызывает эту ошибку. Является ли «SELECT ... минус SELECT ...» равным одному утверждению, поэтому необходимо выделить третий оператор SELECT? Но как?
Взгляните на 'MERGE' - это, вероятно, гораздо лучше, когда вам нужно сравнить две таблицы для' INSERT '. – mathguy
Несколько заметок/вопросов: во-первых, вы не сможете использовать 'DESC' и' KEY' в качестве имен столбцов (они являются недопустимыми именами объектов, поскольку они зарезервированные слова Oracle). В ваших фактических данных вы, вероятно, имеете другие имена, но для тестирования 'DESC' и' KEY' не будет работать.Затем в Oracle 'concat()' довольно ограничен (например, он принимает только два аргумента), вам лучше использовать оператор '||', который делает то же самое. Затем, какие типы данных являются вашими 'req' и' ver'? Если они не являются символьным типом данных, Oracle будет конвертировать их неявно, это то, что вы хотите? – mathguy
Кроме того, вы объединяете req и ver без разделителя; это нечетный тип ключа. 'req = 1, ver = 23' будет иметь тот же ключ, что и' req = 12, ver = 3' - это то, что вам нужно? – mathguy