2010-09-22 4 views
4

Comment rechercher des lignes en double? Si last_name est le champ en double, je veux avoir à afficherRecherche de lignes dupliquées dans la base de données

last_name frst_name frst_name1 frst_name2 .... 

Toute base de données fera, préfèrent oracle.

+0

Quel serveur de base de données utilisez-vous? –

+0

Chaque base de données possède sa propre recette, mais celles-ci sont spécifiques à la base de données. –

+0

@Peter: Quoi ...? –

Répondre

5

En supposant que votre serveur a GROUP_CONCAT parce que vous n'avez pas mentionné celui que vous utilisez:

SELECT GROUP_CONCAT(first_name SEPARATOR ' ') 
FROM table 
GROUP BY last_name 
HAVING COUNT(first_name) > 1 
+2

J'aime beaucoup ça! Pour l'instant, cependant, 'GROUP_CONCAT' est seulement implémenté dans MySQL. Il y a une version d'Oracle sur le lien suivant, et le même blog a aussi des versions pour PostGreSQL et SQL Server. http://explainextended.com/2009/04/05/group_concat-in-oracle-10g/ – eksortso

+0

@eksortso: SQLite prend également en charge la fonction GROUP_CONCAT. –

2
Select a.* from persons a inner join persons b on (a.personID<>b.PersonID and a.last_name=b.last_name) 

PersonID est la clé primaire de votre table.

2

Je ne sais pas si c'est ce que vous demandez, mais je pense que ce que vous recherchez est

 
SELECT * FROM users u1, users u2 
WHERE (u1.last_name = u2.last_name AND COUNT(u1.last_name) > 1)) 

+0

Cela vous donnerait beaucoup de doublons si vous avez un nom de famille très populaire. – eksortso

+0

Je viens de répondre à la question ... Si vous souhaitez également vérifier les autres champs, il vous suffira de les ajouter dans la clause WHERE avec l'option DISTINCT. – dirbacke

+2

Impossible d'utiliser un agrégat (IE: COUNT) dans la clause WHERE, en dehors d'une sous-requête. Après avoir corrigé cette erreur, 'SELECT *' retournerait les lignes des deux copies de la table 'USERS' –

12

Cela devrait fonctionner sur à peu près tous les dialectes SQL:

SELECT last_name, first_name FROM names 
WHERE last_name IN (
    SELECT last_name FROM names GROUP BY last_name HAVING COUNT(*) > 1 
) 

Il vous donnera un jeu de résultats comme celui-ci, cependant:

Smith  Jack 
Smith  Joe 
Smith  Anna 
Sixpack Joe 
Sixpack Eve 

la solution la plus élégante pour afficher ce dans le format désiré est l'OMI juste réorganiser le jeu de résultats par programme dans l'application client au lieu de tirer toutes sortes de cascades SQL obscures; quelque chose comme (pseudo-code):

for each row in resultset 
    if row[last_name] <> previous_last_name 
     print newline, print last_name 
    print ' ' 
    print first_name 
1

j'ai essayé de trouver une solution qui fonctionnerait dans la plupart conformes ANSI serveurs de base de données SQL. Voici ce que j'ai trouvé.

L'idée ici est que vous identifiez les last_name s dupliqués, puis récupérez tous les enregistrements contenant l'un de ces doublons.

SELECT 
    t.last_name, t.frst_name, t.frst_name1, t.frst_name2, ... 
FROM our_table AS t 
WHERE t.last_name IN (
    SELECT t0.last_name 
    FROM our_table AS t0 
    GROUP BY t0.last_name 
    HAVING COUNT(*) > 1 
) 
ORDER BY 
    t.last_name, t.frst_name, t.frst_name1, t.frst_name2, ... 
; 
3

Ha, beaucoup de requêtes. Voici plus

SELECT last_name, first_name FROM names n1 
WHERE 
(
    SELECT count(*) FROM names n2 where n2.last_name = n1.last_name 
) 
> 1 

ou si la table est identifiant unique

SELECT last_name, first_name FROM names n1 
WHERE exists 
(
    SELECT id FROM names n2 where n2.last_name = n1.last_name and n1.id <> n2.id 
) 
+0

J'aime cette solution. Simple et fonctionne très bien. – rboarman

0

Suppose "Dans le client de la table vous avez CustomerKey PK" vous pouvez utiliser:

select 
    customerkey,count(customerkey) 
from 
    customer 
group 
    by customerkey 
having 
    count(customerkey)>1; 

Cela vous donnera tous les customerkeys en double. Maintenant vous pouvez les supprimer.

Questions connexes