我正在尝试从db表中选择所有重复项:
这是我的尝试:
dev=> select * from import_mapper where source_id=12772;
id | entity | source_id | local_id | venue_id
-------+-----------------+-----------+----------+----------
41002 | appointment_mbo | 12772 | 67101 | 50
46046 | appointment_mbo | 12772 | 67101 | 50
46192 | appointment_mbo | 12772 | 87814 | 149
48557 | appointment_mbo | 12772 | 90100 | 66
49310 | appointment_mbo | 12772 | 90750 | 65
(5 rows)
我的预期结果应该只是前两行:
id | entity | source_id | local_id | venue_id
-------+-----------------+-----------+----------+----------
41002 | appointment_mbo | 12772 | 67101 | 50
46046 | appointment_mbo | 12772 | 67101 | 50
注意:无论ID字段是什么
答案 0 :(得分:1)
您可以使用WHERE EXISTS
子句对您在唯一性检查中考虑的每个字段执行此操作:
Select *
From import_mapper m1
Where Exists
(
Select *
From import_mapper m2
Where m1.id != m2.id
And m1.entity = m2.entity
And m1.source_id = m2.source_id
And m1.local_id = m2.local_id
And m1.venue_id = m2.venue_id
)
答案 1 :(得分:0)
SELECT im1.*
FROM import_mapper im1
INNER JOIN import_mapper im2
USING (source_id, local_id, venue_id, entity)
WHERE im1.id != im2.id
这应该给你所有的重复(让id
不在等式中)。
答案 2 :(得分:0)
您可以在除id之外的所有列上执行分组,然后使用必须过滤掉count等于1的列。该解决方案也获得了重复数量。
select id, entity, source_id, local_id, venue_id, count(*) n from
import_mapper group by entity, source_id, local_id, venue_id having n > 1
答案 3 :(得分:0)
大多数数据库都支持ANSI标准窗口函数。所以,你可以尝试:
select t.*
from (select t.*,
count(*) over (partition by entity, source_id, local_id, venue_id) as cnt
from t
) t
where cnt >= 2;
请注意,如果某些列的值为NULL
,则此版本甚至可以直观地工作。