Что ж, random не гарантирует уникальность, и часть NOT Exists ничего не найдет, потому что таблица назначения пуста.
В чистом SQL это не так просто, но, поскольку вы используете БД Oracle, вы можете легкосделай это в plsql.Это должно работать в принципе :).Не проверено.
declare
iOffset pls_interger;
begin
-- Use max value as offset
select max(cl_dni) into iOffset from purchases;
-- Use 1 if no id exists at all
iOffset := nvl(iOffset,1);
-- Loop thru all purchases
for rec in (SELECT distinct cl_dni,cl_name, cl_surn1, cl_surn2, cl_birth, cl_phone, cl_email, cl_address FROM purchases) loop
INSERT INTO client (id, name, surname, surname2, dob, phone, email, address)
VALUES (NVL(rec.id, iOffset), rec.cl_name ..... );
iOffset := iOffset + 1;
end loop;
end;
РЕДАКТИРОВАТЬ Еще один подход заключается в том, чтобы найти максимальное значение, которое я покупаю, и добавить значение rownum, чтобы получить уникальный идентификатор.Попробуйте это, не проверено ...
INSERT INTO client (id, name, surname, surname2, dob, phone, email, address)
SELECT DISTINCT NVL(cl_dni, mv.val + rownum), cl_name, cl_surn1, cl_surn2, cl_birth, cl_phone, cl_email, cl_address
FROM purchases,
(select max(cl_dni) val from purchases) mv;