2015-11-18 3 views
0

J'ai besoin d'une requête qui sélectionne une liste de valeurs dupliquées n'utilisant pas la fonction HAVING COUNT (ceci est dû à une contrainte logicielle qui me permet uniquement d'utiliser SELECT , FROM, et O WH).Comment trouver des valeurs dupliquées dans Oracle sans utiliser HAVING/GROUP BY

De la même manière à ceci:

select column_name, count(column_name) 
from table 
group by column_name 
having count (column_name) > 1; 

Répondre

2

Vous pouvez sélectionner des valeurs de Column_name en double en utilisant une fonction de fenêtre

select * from (
    select column_name, count(*) over (partition by column_name) cnt 
    from mytable 
) t1 where cnt > 1 

une autre requête ici en utilisant exists au cas où vous ne pouvez pas utiliser les fonctions de la fenêtre

Je peux penser à rowid en option:
select * from mytable t1 
where exists (
    select 1 from mytable t2 
    where t2.column_name = t1.column_name 
    and t2.id <> t1.id 
) 
+0

Si l'exigence est seulement d'utiliser select, from, où, comment se fait-il que l'on puisse utiliser quelque chose comme over/partition by? –

2
select column_name from table a 
where a.rowid > 
any(select b.rowid 
from table b 
where a.column_name = b.column_name); 

Voici un example

1

Pour utiliser purement SELECT, FROM, WHERE (Distinct supplémentaire):

SELECT DISTINCT a.column_name FROM mytable as a, mytable as b 
WHERE a.rowID != b.rowID AND a.column_name = b.column_name; 

Ou, peut-être mieux

SELECT DISTINCT a.column_name FROM mytable as a, mytable as b 
WHERE a.rowID < b.rowID AND a.column_name = b.column_name; 

Cela ressemble un exercice dans certains cours de la base de données. Cependant, la réponse n'est pas utile dans la réalité, je pense. :)