2015-11-18 5 views
0

Мне нужен запрос, который выбирает список дублированных значений, который не использует функцию HAVING COUNT (это связано с программным ограничением, которое позволяет мне использовать SELECT , FROM и WHERE).Как найти повторяющиеся значения в Oracle без использования HAVING/GROUP BY

Аналогично этому:

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

ответ

2

Вы можете выбрать повторяющиеся значения column_name с помощью оконной функции

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

вот еще один запрос с использованием exists в случае, если вы не можете использовать оконные функции

select * from mytable t1 
where exists (
    select 1 from mytable t2 
    where t2.column_name = t1.column_name 
    and t2.id <> t1.id 
) 
+0

Если это требование используется только с помощью select, from, where, откуда, можно использовать что-то вроде over/partition by? –

2

Я могу подумать о том, что rowid как опция:

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

Вот example

1

чисто использовать SELECT, FROM, WHERE (с дополнительным DISTINCT):

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

Или, может быть, лучше

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

Это выглядит упражнение в некоторых курсах баз данных. Однако, я думаю, ответ не полезен в реальности. :)