SQL选择表

时间:2016-05-11 19:11:58

标签: sql

我正在尝试从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字段是什么

4 个答案:

答案 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,则此版本甚至可以直观地工作。