3

我需要从表中删除重复记录。语法: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 小提琴:http ://sqlfiddle.com/#!3/898c8/1

4

2 回答 2

0
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)

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

于 2012-12-13T16:50:55.227 回答
0

诀窍是将表 B 中的多行连接到单个字符串。

对于 SQL 服务器,您可以滥用 XML 功能(如果值中有特殊字符可能会出现问题 - 其他有内置函数,如 Sybase 中的 LIST(),它返回一个逗号分隔的列表):

SELECT AID, A1, A2, A3, (
  SELECT B6, B7
  FROM B
  WHERE AID=A.AID
  ORDER BY B6, B7
  FOR XML RAW
) XML
FROM A

http://sqlfiddle.com/#!3/898c8/29/0

现在你有一个平面表,很容易找到和删除重复项(留给读者练习)......

于 2013-10-28T09:50:35.127 回答