УДАЛИТЬ ЛЕВЫМ СОЕДИНЕНИЕМ - PullRequest
0 голосов
/ 04 марта 2019

Я ежедневно получаю CSV-файл в качестве обновления для одной из моих таблиц доступа (в дальнейшем: targetTable) с ок.От 20 до 30 000 строк.Для этого я создал tempTable, где загружаю CSV-файл в ADODB.Stream и выполняю некоторые проверки, и после успешных проверок я загружаю все записи в tempTable.

Я могу полностью удалить целевой объект и вставить всезаписи из tempTable, но проверит, является ли какая-либо запись новой или нет (что означает, что она уже была доставлена ​​в прошлом).Для этой цели у меня есть столбец «обнаружен», где я храню дату, когда эта конкретная запись впервые появляется.Я проверю все столбцы из tempTable со всеми столбцами из targetTable.

В таблице почти 15 столбцов, и мое первое решение было таким:

DELETE * FROM targetTable WHERE (SELECT COUNT(*) FROM tempTable WHERE (targetTable.Id = tempTable.Id) AND (targetTable.Start = tempTable.Start) AND (targetTable.End = tempTable.End) ... 
INSERT INTO targetTable SELECT tempTable.* FROM tempTable LEFT JOIN targetTable ON (targetTable.Id = tempTable.Id) AND (targetTable.Start = tempTable.Start) AND (targetTable.End = tempTable.End)

Производительность DELETEоператор был действительно плох, поэтому я попробовал это:

DELETE targetTable .* FROM targetTable LEFT JOIN tempTable ON ON (targetTable.Id = tempTable.Id) AND (targetTable.Start = tempTable.Start) AND (targetTable.End = tempTable.End) WHERE tempTable.Id Is Null;

Я получаю сообщение об ошибке «Удаление в этих таблицах невозможно».В представлении таблицы данных скорость кажется очень высокой, но в моем утверждении должно быть что-то не так.

У кого-нибудь есть идея или лучшее решение?

1 Ответ

0 голосов
/ 04 марта 2019

Как насчет использования не существует?Как-то так.

DELETE targetTable.*
FROM targetTable 
where not exists 
(Select 1 
from tempTable 
where targetTable.Id = tempTable.Id
AND targetTable.Start = tempTable.Start
AND targetTable.End = tempTable.End
)
...