SQL Удалить дубликаты, сохраняя только записи с минимальным значением из другого столбца - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь удалить дубликаты заказов из таблицы, сохраняя только заказы с самой ранней датой выставления счета.Я придумал что-то вроде этого, но это работает очень медленно.Имейте в виду, я использую MS Access 2010.

db.Execute "DELETE * FROM [PO Data] AS P1 WHERE [PO Number] = [PO Number] AND [Invoice Date] <> (SELECT MIN([Invoice Date]) FROM [PO Data] AS P2 WHERE P1.[PO Number] = P2.[PO Number])"
db.Execute "DELETE * FROM [PO Data] WHERE [PO Number] = [PO Number]"

Есть идеи, как это улучшить?

Ответы [ 2 ]

0 голосов
/ 18 октября 2018
DELETE 
FROM [PO Data] a
WHERE [Invoice Date] > (SELECT MIN([Invoice Date]) FROM [PO Data] b
WHERE b.[PO Number]=a.[PO Number]);

ИЛИ

DELETE a
FROM [PO Data] a
INNER JOIN [PO Data] b
  ON b.[PO Number]=a.[PO Number] AND a.[Invoice Date]>b.[Invoice Date]

Второй быстрее.потому что нет необходимости выполнять функцию MIN ().Это также зависит от вашего индекса и размера данных.Если количество строк дубликатов невелико, вы можете применить подзапрос.

0 голосов
/ 18 октября 2018

Эта версия:

DELETE * FROM [PO Data] AS P1
    WHERE [PO Number] = [PO Number] AND
          [Invoice Date] <> (SELECT MIN([Invoice Date])
                             FROM [PO Data] AS P2
                             WHERE P1.[PO Number] = P2.[PO Number]
                            );

Имеет пару странных вещей.Почему [PO Number] = [PO Number]?Почему <>?

Рассмотрите этот запрос:

DELETE * FROM [PO Data] AS P1
    WHERE [Invoice Date] > (SELECT MIN([Invoice Date])
                            FROM [PO Data] AS P2
                            WHERE P1.[PO Number] = P2.[PO Number]
                           );

Чтобы ускорить этот запрос, вам нужен индекс для [PO Data]([PO Number], [Invoice Date]).

РЕДАКТИРОВАТЬ:

Если вы хотите самую раннюю дату счета в целом , просто удалите предложение о корреляции:

DELETE * FROM [PO Data] AS P1
    WHERE [Invoice Date] > (SELECT MIN([Invoice Date])
                            FROM [PO Data] AS P2
                           );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...