sql - 在具有来自另一个表的附加数据集的行中搜索重复项

标签 sql tsql duplicate-removal

我需要从表中删除重复的记录。语法:T-SQL (MS SQL Server)

它有两个难点:

  1. 有些字段包含不应影响行比较的数据
  2. 有一个额外的表与第一个“一对多”关系链接

例子:

Table A                 Table B
--------------          --------------
AId - int       <-\     BId - int
A1 - int           \->  AId - int
A2 - varchar            B6 - varchar
A3 - varchar            B7 - varchar
A4 - varchar            B8 - varchar
A5 - int                B9 - int

因此,表 A 中的任何记录都包含字段 AId、A1、A2、A3、A4 和 A5,以及“子记录”列表:表 B 中 B.AId 与 A.AId 匹配的记录列表.例如,它可以是购买交易的列表,其中表 A 包含交易的属性,例如日期/时间或客户 ID,表 B 可以表示商品及其价格和金额的列表。

一旦某些记录被复制。它们有不同的 AId,不同的 BId,不同的 A4、A5、B8 和 B9。所有其他字段都应匹配以使两条记录重复。

因此,在以下情况下,A 中的两条记录 X 和 Y 被认为是重复的:

  • X.A1 == Y.A1
  • X.A2 == Y.A2
  • 表 B 中 AId == X.AId 的所有记录完全匹配表 B 中 AID == Y.AId 的所有记录,但不包括(忽略)B8 和 B9 字段

我至少需要获取此类重复记录的 AID,最多删除这些重复记录但只保留一份记录副本(哪一份无关紧要)。

如果需要以下说明,请告诉我。提前谢谢你。

更新: SQL fiddle :http://sqlfiddle.com/#!3/898c8/1

最佳答案

Select a1, Count(CompareField) From (Select a.a1 as a1, a.a1 + a.a2 +  a.a3 + b.b6 + b.b7 as compareField from A inner join b on a.AID = b.AID) z Group by z.comparefield

这将为您提供所有重复项的列表,然后您可以使用外部查询删除记录 Delete From a Where AID in (prevquery)

可能不需要说明,但是请确保在运行删除查询之前备份数据库。 :)

关于sql - 在具有来自另一个表的附加数据集的行中搜索重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13864020/

相关文章:

WordPress 数据库的 SQL

SQL Server CASE WHEN 和 IN 构造

sql - 删除重复项保持最小 ID

sql - 当您没有唯一键时,如何删除sybase中的重复行?

mysql - 无法启动 MySQL!在启动 XAMPP 时

sql - Oracle自动并行度的原因?

sql - 如何从用户 ID 获取用户名(SQL 连接)

xml - 如何在 SQL Server 2008 R2 中读取 XML 的一部分作为 XML

sql - T-SQL 到 "Merge"两行,或 "Rekey"所有 FK 关系

iphone - 从数组中删除重复项,比较其对象的属性