Доступ: УДАЛИТЬ запрос с предложением WHERE <>: «Этот подзапрос может вернуть не более одной записи» - PullRequest
0 голосов
/ 29 апреля 2020

Я хочу выполнить этот запрос DELETE:

DELETE * FROM Table1 WHERE Table1.ID <> (SELECT Table1.ID FROM Table1 WHERE ....)

Запрос в скобках возвращает все идентификаторы, которые я хочу сохранить в Таблице1 (этот запрос работает сам по себе, я его протестировал). Но как только я добавляю часть DELETE, я получаю следующую ошибку: «Максимально одна запись может быть возвращена этим подзапросом». Я попробовал код

DELETE * FROM Table1 WHERE Table1.ID NOT IN (SELECT Table1.ID FROM Table1 WHERE ....)

Но теперь моя база данных зависает и больше ничего не делает ...

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 29 апреля 2020

На самом деле * не требуется для операторов удаления, потому что он удаляет всю строку, которая соответствует условию where. Обычно <> (не равно) используется для предоставления единственного значения c. (как показано ниже)

DELETE FROM Table1 WHERE Table1.ID <> 1

Но подзапрос возвращает строки / записи (с выбранными столбцами). Следовательно, вы получили ошибку: At most one record can be returned by this subquery

Переход к используемому вами предложению NOT IN, это правильный способ сделать это, но NOT IN может стать довольно сложным, если большее количество строк участвует в подзапросе, так как NOT IN выполняет соединение за укрытием.

Лучший способ в вашем случае - использовать NOT(condition), поскольку вы уже знаете condition, для которого вам нужны требуемые идентификаторы таблицы. (как показано ниже)

DELETE FROM Table1 WHERE NOT(condition)

Это делает вашу работу довольно быстро, поскольку в нее не входят никакие объединения, как в предыдущем случае.

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