从另一个表中带有数据集的行中搜索重复项

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包含交易的属性,例如日期/时间或客户ID,而表B可以表示具有其价格和数量的商品列表。
有些记录重复了。它们具有不同的AId、不同的BId、不同的A4、A5、B8和B9。为使两个记录成为重复记录,所有其他字段都应匹配。
因此,如果满足以下条件,则来自A的两个记录X和Y被视为重复记录:
- X.A1 == Y.A1 - X.A2 == Y.A2 - 表B中所有AId == X.AId的记录完全匹配所有AID == Y.AId的记录,但排除(忽略)B8和B9字段
我至少需要获取这些重复记录的AIds,最多删除这些重复记录,但只保留一份记录副本(无论哪一个都可以)。
请告诉我是否需要以下澄清。谢谢。

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

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)

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


谢谢,但是您能否调整一个小例子: http://sqlfiddle.com/#!3/898c8/1。最终输出应包含AIDs:1和2。3和4不计入,因为B7中有一行中有不同的值。 - 12345

0

技巧在于将表B的多行连接成单个字符串。

对于SQL Server,您可以滥用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

现在您有一个扁平表格,很容易找到和删除重复项(这留给读者作为练习)...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接