查询重复表到相关集

时间:2018-03-13 15:21:00

标签: sql sql-server tsql

我们有一个流程可以根据一些任意规则创建一个重复记录表(详情不相关)。

每个记录都会针对所有其他记录进行检查,如果发现可疑副本,则将其与副本存储在dupe表中以进行人工审核。

这导致表格如下:

dupId,  originalId, duplicateId
1       1           2
2       1           3
3       1           4
4       2           3
5       2           4
6       3           4
7       5           6
8       5           7
9       6           7
10      8           9

你可以在这里看到记录#1有3个与它类似的其他记录(#2,#3和#4),它们各自相似。 记录#5有2个重复(#6和#7),记录#8只有1个(#9)。

我想将重复项查询到集合中,因此我的结果看起来像这样:

setId   recordId
1       1
1       2
1       3
1       4
2       5
2       6
2       7
3       8
3       9

但是我太老了/太慢/累了/垃圾,这里有点超出我的深度。

目前,当检查重复项时,如果记录配对已经在表格中,我们不会插入两次(即您不会看到重复配对的两侧)但是如果它没有,则可以轻松地进行使查询更简单。

任何建议都非常感谢!

1 个答案:

答案 0 :(得分:3)

重复似乎是传递性的,所以你拥有所有对。也就是说,“原始”ID具有您需要的信息。

但它没有包含在副本中,你想要那样。所以:

select dense_rank() over (order by originalid) as setid, duplicateid
from ((select originalid, duplicateid
       from t
       where not exists (select 1 from t t2 where t.originalid = t2.duplicateid)
      ) union all
      (select distinct originalid, originalid
       from t
       where not exists (select 1 from t t2 where t.originalid = t2.duplicateid)
      )
     ) i
order by setid;