2009-08-25 15 views
2

J'ai besoin d'un code SQL qui permettra d'identifier les doublons possibles dans une table. Disons que ma table a 4 colonnes:SQL Recherche de doublons possibles

  • ID (clé primaire)

  • Date1

  • Date2

  • GroupID

(date1, date2, GroupID) forment une clé unique.

Cette table est remplie avec des blocs de données à la fois, et il arrive souvent qu'un nouveau bloc soit chargé contenant un certain nombre d'enregistrements qui s'y trouvent déjà. Cette amende tant que la clé unique les attrape. Malheureusement, parfois Date1 est vide (ou au moins '1900/01/01') soit avec le premier téléchargement ou suivant.

Donc ce que je besoin est quelque chose pour déterminer où les (Date2, GroupID) combinaison apparaissent plus d'une fois et où pour un des enregistrements Date1 = « 1900/01/01 »

Merci

Karl

+0

Si vous avez plusieurs entrées avec Date1 étant 1900/01/01, et Date2 et GroupID le même, est-il considéré comme multiple? Je suppose que c'est ... –

+0

dans ce cas ce ne serait pas un problème - ne devient un problème que si Date1 est 1900/01/01 dans un téléchargement mais a une valeur dans un autre – Karl

+0

Je voulais dire si vous avez plusieurs entrées avec Date1 étant 1900/01/01, et Date2 et GroupID le même, mais un Date1 a une valeur (avec les mêmes Date2 et GroupID). –

Répondre

2

bkm a, mais la sélection interne peut mal fonctionner sur certaines bases de données. Ceci est plus simple:

select t1.* from 
t as t1 left join t as t2 
on (t1.date2=t2.date2 and t1.groupid=t2.groupid) 
where t1.id != t2.id and (t1.date1='1900/01/01' or t2.date2='1900/01/01') 
+0

fonctionne parfaitement, il suffit de sélectionner DISTINCT t1. * ..... – Karl

0

Une contrainte de vérification peut-être.

Quelque chose du genre select count(*) where date1 = '1900/01/01' and date2 = @date2 and groupid = @groupid.

juste besoin de voir si vous pouvez le faire dans une contrainte au niveau de la table ....

+0

Avec un exemple de code, je pense que c'est la réponse. – Cellfish

0

En plus d'avoir un champ de clé primaire définie sur la table, vous pouvez également ajouter d'autres contraintes UNIQUE pour effectuer la le même genre de chose que vous demandez. Ils vont valider qu'une colonne particulière ou un ensemble de colonnes a une valeur unique dans la table.

Découvrez l'entrée dans le manuel MySQL pour un exemple:

http://dev.mysql.com/doc/refman/5.1/en/create-table.html

1

Vous pouvez identifier les doublons sur (date2, GroupID) en utilisant

Select date2,GroupID 
from t 
group by (date2,GroupID) 
having count(*) >1 

Utilisez cette option pour identifier les enregistrements dans le principal table qui sont en double:

Select * 
from t 
where date1='1900/01/01' 
and (date2,groupID) = (Select date2,GroupID 
         from t 
         group by (date2,GroupID) 
         having count(*) >1) 

NOTE: Depuis Date1, Date2, GroupID forme une clé unique, vérifiez si votre conception est correcte en autorisant Date1 à être NULL. Vous pourriez avoir un véritable cas où Date 1 est différent pour deux rangées while (date2, GroupID) est le même

+0

Malheureusement, je dois tenir compte du fait qu'il peut y avoir aucune information disponible pour Date1 – Karl

0
select * from table a 
join (
select Date2, GroupID, Count(*) 
from table 
group by Date2, GroupID 
having count(*) > 1 
) b on (a.Date2 = b.Date2 and a.GroupID = b.GroupID) 
where a.Date1 = '1900/01/01' 
1

Si je comprends bien, vous êtes à la recherche d'un groupe d'ID pour lesquels GroupID et Date2 sont les De même, il y a une occurence de Date1 qui est différente de 1900/01/01, et tout le reste des Date1 sont 1900/01/01.

Si je l'ai eu droit, voici la requête pour vous:

SELECT T.ID 
FROM Table T1 
WHERE 

(T1.GroupID, T1.Date2) IN 
    (SELECT T2.GroupID, T2.Date2 
    WHERE T2.Date1 = '1900/01/01' OR 
     T2.Date IS NULL 
    GROUP BY T2.GroupID, T2.Date2) 

AND 

1 >= 
(
    SELECT COUNT(*) 
    FROM TABLE T3 
    WHERE NOT (T3.Date1 = '1900/01/01') 
    AND NOT (T3.Date1 IS NULL) 
    AND T3.GroupID = T1.GroupID 
    AND T3.Date2 = T1.Date2 
) 

espoir qui aide.

0

Ceci est la façon la plus simple que je peux penser à le faire:

SELECT DISTINCT t1.* 
FROM t t1 JOIN t t2 USING (date2, groupid) 
WHERE t1.date1 = '1900/01/01'; 

Pas besoin d'utiliser GROUP BY qui fonctionne mal sur certaines marques de base de données.