как эффективно выбрать все дубликаты - PullRequest
8 голосов
/ 28 июня 2011

Я хочу выбрать все строки, значения которых уже существуют в таблице.Я не нашел лучшего решения, чем

select * 
from provisioning_requests tt 
where code in (select code 
               from provisioning_requests tt2 
               where tt2.id <> tt.id)

Это кажется немного наивным.У кого-нибудь есть лучшее решение?

Ответы [ 8 ]

15 голосов
/ 28 июня 2011
select * 
from provisioning_requests t1
 join (select code from provisioning_requests group by code having count(*)>1) t2
 ON t1.code = t2.code

ИЛИ

select * 
from provisioning_requests
 WHERE code in (select code from provisioning_requests group by code having count(*)>1)
9 голосов
/ 28 июня 2011

Автоматическое объединение делает работу

select tt.* 
from provisioning_requests tt 
    INNER JOIN provisioning_requests tt2 
        ON tt.code = tt2.code
        AND tt2.id <> tt.id
2 голосов
/ 28 июня 2011
select t.*
from(
    select *, count(1) over(partition by code) as cnt
    from test
) as t
where t.cnt > 1
1 голос
/ 28 июня 2011

Возможно, использование self join, а также столбца index over Code улучшит его производительность.

select pr1.* from provisioning_requests pr1
join provisioning_requests pr2 on pr1.code = pr2.code and pr1.id <> pr2.id
1 голос
/ 28 июня 2011

Вы можете использовать оператор exists, он дает лучшую производительность:

select * 
from provisioning_requests tt 
where exists
(
    select 1
    from provisioning_requests tt2
    where tt2.id <> tt.id and tt2.code = tt.code
)
1 голос
/ 28 июня 2011

Как насчет использования отличного ключевого слова?

SELECT col1, col2, col3, ..., DISTINCT(code) from provisioning_requests;
1 голос
/ 28 июня 2011

Вы можете контролировать коды строк по

select code 
from provisioning_requests tt 
group by code
having count(code) > 1
0 голосов
/ 28 июня 2011

как насчет:

SELECT *,COUNT(*) FROM provisioning_requests HAVING COUNT(*)>1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...