2011-10-19 4 views
3

Disons que je le tableau suivantTrouver toutes les lignes en double dans une table

first last  value 
tony jones  1 
james guy  5 
sara miller 6 
tony jones  2 
sara miller 3 
joe  cool  4 
david marting 7 

Y at-il une commande pour interroger rapidement toutes les lignes en double.

Je finirais avec:

first last  value 
tony jones  1 
tony jones  2 
sara miller 6 
sara miller 3 

Aide!

Ceci est la requête que je dois ajouter ceci à:

SELECT l.create_date, l.id, c.first_name, c.last_name, c.state, c.zipcode, 
l.source AS 'affiliateId', ls.buyer, ls.amount FROM lead_status AS ls 
INNER JOIN leads AS l ON l.id = ls.lead_id 
INNER JOIN contacts AS c ON c.lead_id = l.id 
WHERE ls.discriminator = 'AUTO_POST' AND l.affiliate_id=1003 
AND ls.winner =1 AND l.test =0 AND l.create_date BETWEEN '2011-10-03' AND '2011-10-19'; 
+0

Les valeurs sont-elles uniques pour chaque première/dernière combinaison? –

+0

Oui, ils ne sont que des prénoms et des noms de famille. – ATMathew

+0

voulez-vous simplement sélectionner ou supprimer des doublons? – user973254

Répondre

4
SELECT t1.* 
FROM <table> t1, <table> t2 
WHERE t1.first=t2.first AND 
    t1.last=t2.last AND 
    t1.value<>t2.value 
; 
+0

+1 Bien que je voudrais changer la jointure implicite à un explicite 'INNER JOIN' –

+1

Vous devez dire' SELECT DISTINCT ... 'ou changer votre requête. Que se passe-t-il si nous avons des lignes ('tony', 'jones', 1), ('tony', 'jones', 2) et ('tony', 'jones', 3)? Vous obtiendrez plus de trois enregistrements 'tony jones' retournés ... – pilcrow

2

Si vous ne voulez répétiez ....

select t2.first, t2.last , t1.value from (
     select first, last, count(*) from your_table 
     group by first, last 
     having count(*)>1 
    ) t2 inner join your_table t1 on (t1.first=t2.first and t1.last=t2.last) 

De plus,

select first, last , count(*) from your_table 
group by first, last 

Retournera premier , dernier et une colonne supplémentaire avec le nombre de fois que l'enregistrement est répété

3

Cela devrait le faire efficacement, en supposant une indexation correcte et que la valeur est unique pour chaque ligne:

SELECT first, 
     last, 
     value 
FROM MyTable AS T1 
WHERE EXISTS (-- Is there another row with the same first/last name, 
    SELECT *  -- but a different value 
    FROM MyTable AS T2 
    WHERE T2.first=T1.first 
    AND T2.last=T1.last 
    AND T2.value<>T1.value 
) 
0

Que diriez-vous simplement en utilisant « SELECT DISTINCT ... »? Ne fait-il pas le travail?

Questions connexes