Сохраняйте первую из повторяющихся записей и удаляйте остальные

Этот вопрос делает в значительной степени то, что я хочу сделать, но моя таблица сложнее и не имеет первичного ключа. Я также не совсем понимаю верхний ответ, что означают t1 и t2. Если этот ответ применим ко мне, был бы признателен, если бы кто-нибудь объяснил код.

У меня есть таблицы за несколько месяцев, которые содержат информацию о клиентах и ​​их политиках. Каждый клиент имеет уникальный идентификатор политики, но у них может быть несколько политик, что приводит к появлению нескольких записей с одним и тем же идентификатором политики. Дублирующиеся записи могут быть совершенно разными или абсолютно одинаковыми в каждом поле.

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

Я не планирую создавать первичный ключ, потому что в некоторых случаях я буду хранить две записи под одним и тем же идентификатором политики, и я сам внесу изменения в код. Я также не хочу создавать еще одну таблицу, потому что я работаю с 10+ таблицами. Кто-то предложил использовать first(), но я не уверен, как включить его в запрос.

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация, и спасибо за вашу помощь заранее!

=========ОБНОВЛЕНИЕ #1

Хорошо, похоже, мой вопрос был немного нереалистичным, поэтому я добавлю первичный ключ autonumber. Как я буду поступать с этим?


person Emily    schedule 28.03.2012    source источник
comment
Вам действительно следует подумать о добавлении первичного ключа, так как это значительно упрощает идентификацию одной записи и поможет вам удалить дубликаты. Обратите внимание, что наличие первичного ключа не означает, что у вас не может быть дубликатов.   -  person DJ.    schedule 28.03.2012
comment
Я думаю, тебе придется кое в чем уступить. Либо вам нужно будет создать новую таблицу, либо вам придется добавить уникальный ключ.   -  person Fionnuala    schedule 28.03.2012


Ответы (1)


Что-то в этих строках:

DELETE Policies.*
FROM Policies
WHERE Policies.ID Not In (
   SELECT TOP 1 id
   FROM   policies p
   WHERE  p.policyid = policies.policyid
   ORDER  BY createdate DESC, id )
person Fionnuala    schedule 28.03.2012
comment
Я попытался запустить оператор внутренней скобки SELECT самостоятельно, и он попросил меня ввести значение параметра Policies.PolicyID. Могу я просто подтвердить, что правильно понимаю ваш код? ID = первичный ключ автонумерации; Полисы = таблица; P = Таблица политик. Не будет ли тогда предпоследняя строка всегда верной? Кроме того, внутренняя скобка выводит только одну запись. - person Emily; 29.03.2012
comment
Идея использует два идентификатора: идентификатор политики, упомянутый в вашем тексте, который можно дублировать, и идентификатор, который является новым автоматическим номером. Внутренняя скобка выводит одну запись для каждого идентификатора политики, что вы и хотите получить. Я тестировал с образцом таблицы. - person Fionnuala; 29.03.2012
comment
Оооо, хорошо, извините, я только что понял код. Я сделал тестовый прогон на одной из своих таблиц с 30 тыс. записей. Кажется, это работает! Так что спасибо тебе! И последнее, однако, выполнение запроса заняло довольно много времени - это нормально? Я просто беспокоюсь, потому что в одной из моих таблиц 900 тысяч записей. - person Emily; 29.03.2012
comment
Такой запрос не будет быстрым. Вам приходится делать это часто? - person Fionnuala; 29.03.2012
comment
Нечасто, это одноразовая вещь для исследования, но у меня есть 15 столов для этого, 14 из них ~ 35k и один огромный на 900k. Я проверял тестовый запрос, который я сделал - он сделал большинство из них правильно, но 2 записи, которые должны были быть удалены, все еще были там... не мог увидеть ничего особенного с двумя записями... - person Emily; 29.03.2012