2010-10-15 32 views
0

J'essaie de supprimer tous les enregistrements sauf un de la table où le champ de nom répète la même valeur plus de 5 fois et le champ d'adresse répète plus que cinq fois pour une table. Donc, s'il y a 5 enregistrements avec un champ de nom et champ d'adresse qui sont les mêmes pour tous les 5, je voudrais supprimer 4 sur 5. Un exemple:Utilisation de sql pour conserver un seul enregistrement où le champ de nom et le champ d'adresse se répètent dans 5 enregistrements

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

Je veux seulement revenir 1 dossier à partir des 5 enregistrements ci-dessus.

J'ai encore des problèmes avec ça.

1) Je crée une table appelée KeepThese et lui donne un identifiant de clé primaire. 2) Je crée une requête appelée delete_1 et copier ce en elle:

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) Je crée une requête appelée delete_2 et copier ce en elle:

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

4) Ensuite, je lance delete_1. Je reçois un message qui dit "référence circulaire causée par alias ID" Donc, je change cette pièce: DE (SELECT min (ID) AS ID pour dire ceci: DE (SELECT min (ID) AS ID2 Puis je double-cliquez Une fenêtre contextuelle s'affiche indiquant Entrer la valeur du paramètre pour l'ID.Cela indique qu'il ne sait pas quel ID est.Parce que print_ready est seulement une requête et qu'il a un ID, c'est en réalité l'ID d'une autre table qui a été filtrée dans cette requête.

Je ne sais pas ce qu'il faut faire à ce stade.

+0

'Min (P.ID) Comme ID' devrait fonctionner car il n'est plus ambigu. Mais il semble que vous oubliez un peu votre SQL. –

Répondre

0

CREATE TABLE isolate_duplicates AS ne vous travailler pour l'accès, à côté, vous devez donner un nom pour le nombre (*) pour la nouvelle table.

Ce travail peut-être:

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 

Non testé.

+0

De même, noms_1 et adresses ne sont pas des noms de champs valides dans la table source. Cette requête est pleine d'erreurs. – JohnFx

+0

J'ai mis à jour mon message en utilisant une technique différente, mais je rencontre toujours des problèmes. – JohnMerlino