postgresql 如何有效地选择所有重复项

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/6504061/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-20 23:06:26  来源:igfitidea点击:

how to select all duplicates efficiently

sqlpostgresql

提问by nathanvda

I want to select all rows that have a value that already exists in the table. I did not find a better solution than

我想选择表中已存在值的所有行。我没有找到比这更好的解决方案

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

This seems a bit naive. Does anybody have a better solution?

这似乎有点天真。有人有更好的解决方案吗?

回答by niktrs

select * 
from provisioning_requests t1
 join (select code from provisioning_requests group by code having count(*)>1) t2
 ON t1.code = t2.code

OR

或者

select * 
from provisioning_requests
 WHERE code in (select code from provisioning_requests group by code having count(*)>1)

回答by Cyril Gandon

An Auto join do the job

自动加入完成这项工作

select tt.* 
from provisioning_requests tt 
    INNER JOIN provisioning_requests tt2 
        ON tt.code = tt2.code
        AND tt2.id <> tt.id

回答by Petar Ivanov

select t.*
from(
    select *, count(1) over(partition by code) as cnt
    from test
) as t
where t.cnt > 1

回答by Kirill Polishchuk

You can use operator exists, it produces better performance:

您可以使用 operator exists,它会产生更好的性能:

select * 
from provisioning_requests tt 
where exists
(
    select 1
    from provisioning_requests tt2
    where tt2.id <> tt.id and tt2.code = tt.code
)

回答by Rez.Net

Perhaps using self join and also an index over Code column would make it perform better.

也许使用自连接和 Code 列上的索引会使其性能更好。

select pr1.* from provisioning_requests pr1
join provisioning_requests pr2 on pr1.code = pr2.code and pr1.id <> pr2.id

回答by Talha Ahmed Khan

you can monitor the row Codes by

您可以通过以下方式监控行代码

select code 
from provisioning_requests tt 
group by code
having count(code) > 1

回答by Sterex

How about using the distinct keyword?

如何使用不同的关键字?

SELECT col1, col2, col3, ..., DISTINCT(code) from provisioning_requests;

回答by rrapuya

how about :

怎么样 :

SELECT *,COUNT(*) FROM provisioning_requests HAVING COUNT(*)>1