10
votes

Query SQL pour des enregistrements non dupliqués

Je tente de créer une requête qui retournera tous les enregistrements non dupliqués (uniques) dans une table. La requête devra utiliser plusieurs champs pour déterminer si les enregistrements sont dupliqués.

Par exemple, si une table présente les champs suivants; PKID, CLIENTID, NOM, ACCTNO, OrdonnanceDATED, CHARGE, J'aimerais utiliser les champs ACCTNO, OrderDate et chargez-vous pour rechercher des enregistrements uniques. P>

Table P>

PKID-----ClientID-----Name-----AcctNo-----OrderDate-----Charge
2        JX220        Mark     55567      9/9/2010       $23.00
3        JX690        Matt     89899      9/9/2010      $218.00


1 commentaires

Pouvez-vous montrer le code que vous utilisez?


7 Réponses :


11
votes

comptez (*) = 1 fonctionnera si vous n'incluez que les champs du groupe par que vous utilisez pour trouver les enregistrements uniques. (c.-à-d. non pkid , mais vous pouvez utiliser max ou min pour retourner cela puisque vous n'aurez qu'un enregistrement par groupe dans le jeu de résultats .)


1 commentaires

Ok, j'ai couru la requête à nouveau à l'aide de Count = 1 et ça a fonctionné! Pour une raison quelconque quand je le faisais auparavant, il a renvoyé tous les enregistrements. Merci pour le coupez la bonne direction.



5
votes
SELECT PKID      ,
       ClientID  ,
       Name      ,
       AcctNo    ,
       OrderDate ,
       Charge
FROM   YourTable t1
WHERE  NOT EXISTS
       (SELECT *
       FROM    YourTable t2
       WHERE   t1.PKID     <> t2.PKID
       AND     t1.AcctNo    = t2.AcctNo
       AND     t1.OrderDate = t2.OrderDate
       AND     t1.Charge    = t2.Charge
       )

0 commentaires

4
votes

Ajouter simplement:

GROUP BY AcctNo, OrderDate, Charge
HAVING COUNT(1) = 1


0 commentaires

1
votes

Merci Kekekela pour le nudge dans la bonne direction.

Voici la requête qui a produit le résultat que je voulais: xxx

ou plus simplifié en fonction de l'exemple de GUS: < / p> xxx


0 commentaires

0
votes

Vous pouvez simplement supprimer le pkid pour renvoyer tous les enregistrements: xxx


Note: Ceci est légèrement différent de ce que vous demandez.
Il renvoie un ensemble unique en supprimant le champ non unique.
Par votre exemple, vous demandez de retourner des non-duplicats.

Je ne pouvais que voir votre exemple d'être utile si vous essayez de
nettoyer une table en extrayant les "bons" enregistrements.


0 commentaires

0
votes

Vous pouvez d'abord déterminer les enregistrements non uniques, puis tester ces enregistrements non dans cet ensemble - comme celui-ci xxx

La dernière partie de la requête interne vous permet de violouer les critères Pour "Égalité" - Ajoutez le nombre requis de colonnes à tester. Bien sûr, cela obtient beaucoup plus intéressant sans que la clé primaire :) Dans de tels cas, je finis généralement à créer un

kétil


2 commentaires

La requête ne doit-elle pas lire > ou << / code> au lieu de <> ? Avec <> , le résultat contiendra aucun des lignes dupliquées au lieu d'une seule copie


Non, le <> vous assure que vous ne testez pas un enregistrement contre lui-même - identique à la solution Martin Smiths # 2. A ne chercherait que des doublons sur PKIDS avec des valeurs PKID plus hautes ou inférieures - pas suffisamment pour assurer l'unicité des colonnes de données spécifiées.



0
votes
 SELECT GMPS.gen.ProductDetail.PaperType, GMPS.gen.ProductDetail.Size FROM
 GMPS.gen.ProductDetail GROUP BY GMPS.gen.ProductDetail.PaperType,
 GMPS.gen.ProductDetail.Size
 HAVING COUNT(1) = 1;

0 commentaires