我需要从表中删除重复的记录。语法:T-SQL (MS SQL Server)
它有两个难点:
- 有些字段包含不应影响行比较的数据
- 有一个额外的表与第一个“一对多”关系链接
例子:
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/