Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从SQL表中删除重复数据_Sql_Sql Server_Sql Server 2005_Tsql_Sql Server 2008 - Fatal编程技术网

如何从SQL表中删除重复数据

如何从SQL表中删除重复数据,sql,sql-server,sql-server-2005,tsql,sql-server-2008,Sql,Sql Server,Sql Server 2005,Tsql,Sql Server 2008,我正在从第三方来源上传和更新我的数据库。不幸的是,来自第三方数据源的数据中有许多重复记录 我在这里看了几个问题,但所有这些问题似乎都是有一个ID列区分一行和另一行的情况 在我的例子中,没有ID列。e、 g State City SubDiv Pincode Locality Lat Long Orissa Koraput Jeypore 764001 B.D.Pur 18.7743 82.5693 Orissa Koraput Jeypore 764001 Jeypor

我正在从第三方来源上传和更新我的数据库。不幸的是,来自第三方数据源的数据中有许多重复记录

我在这里看了几个问题,但所有这些问题似乎都是有一个ID列区分一行和另一行的情况

在我的例子中,没有ID列。e、 g

State   City    SubDiv  Pincode Locality Lat    Long
Orissa  Koraput Jeypore 764001  B.D.Pur 18.7743 82.5693
Orissa  Koraput Jeypore 764001  Jeypore 18.7743 82.5693
Orissa  Koraput Jeypore 764001  Jeypore 18.7743 82.5693
Orissa  Koraput Jeypore 764001  Jeypore 18.7743 82.5693
Orissa  Koraput Jeypore 764001  Jeypore 18.7743 82.5693
是否有一个简单的查询,我可以运行删除所有重复记录,并保留一个记录作为原始记录?所以在上面的例子中,我想从表中删除第3、4、5行


我不确定是否可以使用简单的sql语句来实现这一点,但我想知道其他人对如何实现这一点的看法

添加一列以消除重复并保留它 从OldTable中选择DISTINCT*到一个新表,然后重命名等 使用t-clausen.dk的CTE方法
然后在所需的列上添加一个唯一的索引

我会将第三方数据插入到一个临时表中,然后:

insert into
  target_table
select distinct
  *
from
  temporary_table
最后删除临时表

仅将不同的唯一行插入到目标表中。

尝试此操作

alter table mytable add id int identity(1,1)

delete  mytable  where id in (
select duplicateid from (select ROW_NUMBER() over (partition by State ,City ,SubDiv ,Pincode ,Locality ,Lat ,Long order by State ,City ,SubDiv ,Pincode ,Locality ,Lat ,Long ) duplicateid
from mytable) t where duplicateid !=1)

alter table mytable drop column id 

您是否可以在表中添加一个ID列,然后使用您已经阅读过的方法之一?另外,如果您不想在表中输入重复项,那么不从其他数据源导入重复项也值得一试?标识列添加了什么值?这很接近,但请参见@t-clausen.dk的答案-不需要标识列。如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,并单击编辑器工具栏上的“代码示例”按钮{},以很好地格式化和语法突出显示它+1另一种方法是使用DISTINCT将数据复制到temp表中。我更喜欢这种方法,因为它让你有机会验证手术的结果;删除rn>1也应该有效的cte,但如果您犯了错误,您已经销毁了数据。只想补充一点,此解决方案与@t-clausen.dk提出的解决方案一样有效,但无法防止再次发生这种情况。重复数据后,您需要在数据的自然键上放置唯一索引。您可能还需要修复导入过程。
alter table mytable add id int identity(1,1)

delete  mytable  where id in (
select duplicateid from (select ROW_NUMBER() over (partition by State ,City ,SubDiv ,Pincode ,Locality ,Lat ,Long order by State ,City ,SubDiv ,Pincode ,Locality ,Lat ,Long ) duplicateid
from mytable) t where duplicateid !=1)

alter table mytable drop column id