0

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

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

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

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

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

http://imgur.com/cOpXZAr

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

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

4

2 回答 2

1

这为您提供了重复项:

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

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

于 2013-10-01T14:51:18.450 回答
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
)
于 2013-10-01T15:37:52.707 回答