如何为一组ID返回重复的行?

时间:2013-10-01 14:35:00

标签: sql

我试图谷歌这个,但我不知道如何写它而不需要解释自己。

基本上我有一个数据集,我正在执行一些验证,我正在寻找从我正在处理的数据库用户的重复数据导入。

原因是用户一直在将建筑信息导入数据库。在某些情况下,名称(例如)不正确,因此他们修改了导入文件并重新上传了数据。

问题在于,进口商(可以理解)不是更换现有建筑,而是创建新的建筑记录。因此,我需要一种方法来返回具有重复的构建记录,以便我们可以删除旧记录。

显然这并不完美,但我正在尝试使用公共字段(建筑物大小,位置)来查找重复项,因为这些字段将是相同的;它只是会改变的名字。所以,如果我有如下所示的表格,我将如何隔离重复的行? (对不起imgur链接,我不知道如何将文本格式化为表格式格式;表格非常简化)

http://imgur.com/cOpXZAr

所以你可以看到LocationID 1和4的建筑物只导入了一次,但是LocationId 2的导入已经运行了两次,而且是LocationID 3的3次 - 这些是我需要找到的记录。

我只是想知道是否有一些东西可以用来隔离一系列列重复的行 - 有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

这给你重复:

select *
from TheTable
where (BuildingNo, BuildingArea, LocationId) in
(
  select BuildingNo, BuildingArea, LocationId
  from TheTable
  group by BuildingNo, BuildingArea, LocationId
  having count(*) > 1
);

您使用什么数据库系统?这适用于Oracle。它也应该在其他dbms中工作。

答案 1 :(得分:0)

假设您有一个在SQL Server中自动递增的主键(即设置标识种子),您可以编写以下查询来标识数据库中最早的记录,其中有多个记录具有相同的构建,大小和位置数据:

SELECT building, size, location, MIN(ID)
FROM LoadedTableData
GROUP BY building size, location
HAVING COUNT(*) > 1

相应地,您可以按如下方式删除这些行:

DELETE FROM LoadedTableData
WHERE ID IN (
  SELECT MIN(ID) as MIN_ID
  FROM LoadedTableData
  GROUP BY building size, location
  HAVING COUNT(*) > 1
)