2009-04-14 10 views
0

J'ai une table avec les colonnes id, a et b. A + b doit être unique, mais il s'agit d'une base de données héritée qui n'est pas contrainte correctement. Comment puis-je obtenir un ensemble d'identifiants pour les enregistrements dans lesquels a + b n'est pas unique?Comment trouver une liste de champs en double

Si je

ID A B 
1 2 3 
2 2 3 
3 1 3 
4 1 4 

Ensuite, je veux obtenir des enregistrements 1 et 2 à l'arrière de la requête.

+0

question similaire (plus récent, différent Approches) http://stackoverflow.com/a/3504059/5962841 – Mafii

Répondre

4
select 
    id, a, b 

from your_table t 

join (select a, b from your_table group by a, b having count(1) > 1) dup on dup.a = t.a and dup.b = t.b 
+1

Merde, vous me battez à elle. Même jusqu'à la méthode (JOIN) et le libellé. Mais le mien ne défile pas. Hah! ;-) +1 pour être plus rapide. – Tomalak

3

Pour revenir lignes 1 et 2 (comme vous l'avez dit), utilisez ceci:

SELECT 
    * 
FROM 
    your_table 
    INNER JOIN (
    SELECT a, b FROM your_table GROUP BY a, b HAVING COUNT(*) > 1 
) dupes ON 
    your_table.a = dupes.a AND 
    your_table.b = dupes.b 
+0

Cela vous semble familier;) –

+0

* lol * Mais ce n'était pas le cas depuis le début. Personne ne peut le prouver, mais * je sais *. ;-) – Tomalak

1

légèrement en utilisant plus rapidement les fonctions de fenêtre:

select * 
from (
    select 
     a 
    , b 
    , cnt = count(*) over (partition by a, b) 
    from your_table 
) x 
where cnt > 1; /* Dupe */ 
Questions connexes