Удалить несоответствующие записи в Access - PullRequest
0 голосов
/ 06 апреля 2011

У меня есть таблица в базе данных Access, где на записи можно ссылаться из любой из двух других таблиц.Мне нужно удалить записи из этой таблицы, если на них не ссылаются другие.Мое лучшее решение до сих пор состояло в том, чтобы создать подзапрос для возврата идентификаторов ссылочных записей и ссылки на подзапрос из запроса на удаление.(Подзапрос должен быть отдельным, так как Access не разрешает UNION во вложенных подзапросах.)

Итак ...
SelectQuery:

SELECT TableB.id FROM TableB INNER JOIN TableA ON TableB.id = TableA.id  
UNION  
SELECT TableC.id FROM TableC INNER JOIN TableA ON TableC.id = TableA.id  

DeleteQuery:

 DELETE * FROM TableA WHERE id NOT IN (SELECT * FROM SelectQuery)

Это мучительно медленно ... должен быть лучший способ?

Я пытался избежать добавления логического поля 'Used' в TableA ...

Ответы [ 4 ]

2 голосов
/ 06 апреля 2011

@ Мэтью PK предлагает использовать два подзапроса NOT IN, что теоретически является хорошей идеей, но, как я заметил в комментарии, Jet IN / ACE плохо оптимизируют NOT IN и NOT EXISTS и часто не используют индексы с обеих сторон.сравнения.Мне интересно, нужны ли подзапросы или нет:

  DELETE *
  FROM (TableA LEFT JOIN TableB ON TableA.ID = TableB.ID) LEFT JOIN TableC ON TableA.ID = TableC.ID
  WHERE TableB.ID Is Null AND TableC.ID Is Null;

Это определенно будет использовать ваши индексы.Если подзапрос необходим, вы можете заменить TableB и TableC соответствующими подзапросами.

1 голос
/ 06 апреля 2011

Почему бы не что-то вроде этого:

DELETE FROM TableA 
WHERE 
    id NOT IN (SELECT id FROM TableB)
AND
    id NOT IN (SELECT id FROM TableC)

0 голосов
/ 15 января 2015
/* delete more records */

DELETE FROM table1
WHERE NOT EXISTS
(SELECT field FROM table2 WHERE table2.field = table1.field)
0 голосов
/ 06 апреля 2011

Допустимо ли создавать новую таблицу на основе вашего SelectQuery, удалять исходную таблицу и переименовывать новую в исходное имя?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...