2 votes

Recherche de doublons éventuels en SQL

J'ai besoin d'un code SQL qui identifiera les éventuels doublons dans une table. Disons que ma table a 4 colonnes :

  • ID (clé primaire)

  • Date1

  • Date2

  • GroupID

(Date1, Date2, GroupID) forment une clé unique.

Cette table est remplie de blocs de données à la fois, et il arrive souvent qu'un nouveau bloc soit chargé et contienne un certain nombre d'enregistrements qui s'y trouvent déjà. Cela ne pose aucun problème tant que la clé unique les capture. Malheureusement, il arrive que Date1 soit vide (ou du moins '1900/01/01'), que ce soit lors du premier téléchargement ou des téléchargements suivants.

Ce dont j'ai besoin, c'est de quelque chose qui identifie les cas où la combinaison (Date2, GroupID) apparaît plus d'une fois et où pour un des enregistrements Date1 = "1900/01/01

Gracias

Karl

2voto

SquareCog Points 12947

Bkm l'a en quelque sorte, mais la sélection interne peut avoir de mauvaises performances sur certaines bases de données. C'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')

1voto

bkm Points 580

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

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

Utilisez ceci pour identifier les enregistrements de la table principale qui sont des doublons :

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

NOTE : Puisque Date1, Date2, GroupID forment une clé unique, vérifiez si votre conception est correcte en permettant à Date1 d'être NULL. Vous pouvez avoir un cas réel où la date 1 est différente pour deux lignes alors que (date2,GroupID) est le même.

1voto

Roee Adler Points 10146

Si je comprends bien, vous recherchez un groupe d'ID pour lequel GroupID et Date2 sont identiques, il y a une occurrence de Date1 différente de 1900/01/01, et toutes les autres Date1 sont 1900/01/01.

Si j'ai bien compris, 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
)

J'espère que cela vous aidera.

0voto

LRE Points 532

Une contrainte de contrôle peut-être.

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

Il faut juste voir si vous pouvez faire cela dans une contrainte au niveau de la table .....

0voto

Brent Nash Points 6337

En plus d'avoir un champ PRIMARY KEY défini sur la table, vous pouvez également ajouter d'autres contraintes UNIQUE pour effectuer le même genre de chose que ce que vous demandez. Elles valideront qu'une colonne particulière ou un ensemble de colonnes ont une valeur unique dans la table.

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X