sql - 删除重复的行并更新引用

标签 sql sql-server-2005 tsql

如何删除一个表中的重复行,并将另一表中的引用更新为其余行?复制仅发生在名称中。 Id列是Identity列。
例子:
假设我们有两个表DoublesData

Doubles table (
   Id int,
   Name varchar(50)
)

Data Table (
    Id int,
    DoublesId int
)
现在,我在Doubls表中有两个条目:
Id Name
1  Foo
2  Foo
以及数据表中的两个条目:
ID DoublesId
1  1
2  2
最后, double 表中应该只有一个条目:
Id Name
1  Foo
以及数据表中的两个条目:
Id DoublesId
1  1
2  1 
在doubles表中,每个名称可以有任意数量的重复行(最多30个),也可以包含常规的“单”行。

最佳答案

我没有执行此操作,但希望它应该是正确的,并且距离最终解决方案足够近以使您到达那里。如果您愿意,请让我知道任何错误,我将更新答案。

--updates the data table to the min ids for each name
update Data
set id = final_id
from
  Data
join
  Doubles 
on Doubles.id = Data.id
join
(
  select 
    name
    min(id) as final_id
  from Doubles
  group by name
) min_ids
on min_ids.name = Doubles.name

--deletes redundant ids from the Doubles table
delete 
from Doubles
where id not in
(
  select 
    min(id) as final_id
  from Doubles
  group by name
)

关于sql - 删除重复的行并更新引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1497183/

相关文章:

SQL - 更新表,以便在给定另一列的键的情况下对一列求和

SQL - 如何转义 PostgreSQL 中的括号

SQL:将字符串聚合在一起

sql - 是否可以找出 SQL Server 中有多少数据库数据早于 N 年?

sql - 在 SQL Server 中用常量 1 或 0 暗示位

sql - 字符串或二进制数据将被截断。 -- 即使长度比字段长度短

sql - T-SQL : multiple usage of CTE alias - not only in outer query

mysql - 错误 1442 : Can't update table in stored function/trigger because it is already used by statement which invoked this stored function/trigger

mysql - 通过多个不同的列过滤器汇总表

c# - 一个窗口窗体中的两个数据 GridView = 无法将数据保存到第二个数据 GridView