Использование sql для хранения только одной записи, где и поле имени, и поле адреса повторяются в 5+ записях - PullRequest
0 голосов
/ 15 октября 2010

Я пытаюсь удалить все записи, кроме одной, из таблицы, где поле имени повторяет одно и то же значение более 5 раз, а поле адреса повторяется более пяти раз для таблицы.Так что, если есть 5 записей с полями имени и поля адреса, которые одинаковы для всех 5, то я хотел бы удалить 4 из 5. Например:

id name address
1 john 6440
2 john 6440
3 john 6440
4 john 6440
5 john 6440

Я бы хотел только вернуть1 запись из 5 записей выше.

У меня все еще есть проблемы с этим.

1) Я создаю таблицу под названием KeepThese и присваиваю ей идентификатор первичного ключа.2) Я создаю запрос с именем delete_1 и копирую его в него:

INSERT INTO KeepThese
SELECT ID FROM
(
SELECT Min(ID) AS ID
FROM Print_Ready
GROUP BY names_1, addresses
HAVING COUNT(*) >=5

 UNION ALL

SELECT ID FROM Print_Ready as P
INNER JOIN
(SELECT Names_1, addresses
FROM Print_ready
GROUP BY Names_1, addresses
HAVING COUNT(*) < 5) as ThoseLessThan5
ON ThoseLessThan5.Names_1 = P.Names_1
AND ThoseLessThan5.addresses = P.addresses
)

3) Я создаю запрос с именем delete_2 и копирую его в него:

DELETE P.* FROM Print_Ready as P
LEFT JOIN KeepThese as K
ON K.ID = P.ID
WHERE K.ID IS NULL

4) Затем язапустите delete_1.Я получаю сообщение «круговая ссылка, вызванная идентификатором псевдонима». Поэтому я изменяю эту часть: FROM (SELECT Min (ID) AS ID), чтобы сказать следующее: FROM (SELECT Min (ID) AS ID2. Затем я снова дважды щелкаю и всплывающее окноотображается сообщение «Введите значение параметра для идентификатора». Это означает, что он не знает, что такое идентификатор, но print_ready - это всего лишь запрос, и хотя он имеет идентификатор, в действительности это идентификатор другой таблицы, которая была отфильтрована в этом запросе.

Не уверен, что делать в этот момент.

1 Ответ

0 голосов
/ 15 октября 2010

CREATE TABLE isolate_duplicates AS не уверен, что это работает для доступа, кроме того, вы должны дать имя для счета (*) для новой таблицы.

Это может работать:

   SELECT DISTINCT name, address
      INTO isolate_duplicate
      FROM print_ready
      GROUP BY name + address
      HAVING COUNT(*) > 4

   DELETE print_ready
      WHERE name + address
      IN (SELECT name + address
             FROM isolate_duplicate)

   INSERT print_ready
      SELECT *
         FROM isolate_duplicate

   DROP TABLE isolate_duplicate

Не проверено.

...