Удаление дубликатов записей по определенным критериям | MS Access

#mysql #ms-access

#mysql #ms-access

Вопрос:

По сути, у меня есть следующее, вызываемое Table1 со столбцами OrderNum , и Book никогда не должно быть повторяющихся записей любого типа Book для каждого OrderNum , если есть необходимость идентифицировать и удалить.

введите описание изображения здесь

Например:

OrderNum 1 должен быть Book1 указан только один раз, поэтому запрос должен идентифицировать другие 2, Book1 перечисленные для OrderNum 1, и удалить их.

OrderNum 4 должно быть Book2 указано только один раз, поэтому запрос должен идентифицировать другое, Book2 указанное для OrderNum 4, и удалить его.

После выполнения запроса таблица 1 должна выглядеть следующим образом:

введите описание изображения здесь

Я работаю с запросами MS Access, но я ищу решение, которое могло бы работать и для запроса MySQL.

Комментарии:

1. Что случилось с порядком # 2? Похоже, здесь отсутствуют данные.

2. Как так? В заказе № 2 не указаны дубликаты книг, поэтому нет записей для удаления. То же самое касается заказа № 3.

Ответ №1:

Я не знаю, как сделать это изящно ни в MySQL, ни в Access, потому что в вашей таблице нет столбца первичного ключа, который он по праву должен иметь. При доступе вы можете попробовать создать новую таблицу, а затем заполнить ее с помощью следующего запроса:

 INSERT INTO yourNewTable (OrderNum, Book)
SELECT DISTINCT OrderNum, Book
FROM yourTable;
  

Затем удалите yourTable после того, как вы закончите с приведенным выше запросом.

Если бы у вас был столбец первичного ключа / автоматического увеличения в вашей таблице, скажем id , тогда вы могли бы напрямую использовать следующий оператор удаления:

 DELETE
FROM yourTable t1
WHERE EXISTS (SELECT 1 FROM yourTable t2
              WHERE t2.OrderNum = t1.OrderNum AND
                    t2.Book = b1.Book AND
                    t2.id < t1.id);
  

Это оставило бы для каждой (OrderNum, Book) комбинации единственную запись среди дубликатов, которая имеет наименьшее id значение.