根据数据库中的重复记录更新表

时间:2013-08-13 17:39:26

标签: sql tsql

我正在尝试编写一个查询,它将从一个完整的重复表中提取所有不同的记录。我的计划是使用此信息更新我的数据库中的字段,告诉我有特定记录的副本。

这是一个展示我想要完成的事情的例子

Table 1                     Table 2

ID     DuplicateId          ID      MD5 (Pretend these are correct)
1      Null                 1       25622
2      Null                 2       25622
3      Null                 3       86548
4      Null                 4       86548

查询的最终结果应该给我这个

Table 1

ID     DuplicateId
1      
2      1
3      
4      3

这是一个非常简单的例子,但它是我能解释我的情况的最佳方法。如果你想以这种方式思考,最终目标几乎就是孩子/父母的关系。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

您可以通过此查询获得所需内容:

select t2a.id, (case when t2a.id <> min(t2b.id) then min(t2b.id) end) as DuplicateId
from Table2 t2a left outer join
     Table2 t2b
     on t2a.MD5 = t2b.MD5
group by t2a.id;

实现它的更有效方法是:

select id, (case when id <> minid then minid end) as DuplicateId
from (select t.*, min(id) over (partition by MD5) as minid
      from Table2 t
     ) t

如果您确实需要在另一个表格中使用此功能,则可以使用select intoinsert

答案 1 :(得分:1)

使用CTE计算每个相似MD5的行号。然后获取MD5首次出现的ID并更新表1。

;WITH ResultCTE AS
(
    SELECT    ID,
              MD5,
              ROWNUMBER() OVER (PARTITION BY MD5 ORDER BY ID) AS RowNum
    FROM      Table2
)
UPDATE Table1
SET    DuplicateID = CASE 
                         WHEN T1.ID = T2.ID 
                         THEN NULL ELSE T2.ID 
                     END
FROM   Table1 T1
       JOIN Table2 T3
           ON T1.ID = T3.ID
       JOIN (
                SELECT ID, 
                       MD5 
                FROM   ResultCTE 
                WHERE  RowNum = 1
            ) T2
           ON T1.MD5 = T2.MD5 

如果Table1最初没有任何值,那么:

;WITH ResultCTE AS
(
    SELECT    ID,
              MD5,
              ROWNUMBER() OVER (PARTITION BY MD5 ORDER BY ID) AS RowNum
    FROM      Table2
)
INSERT INTO Table1
SELECT    T1.ID,
          CASE 
              WHEN T1.ID = T2.ID 
              THEN NULL ELSE T2.ID 
          END AS DuplicateID 
FROM   Table2 T1
       JOIN (
                SELECT ID,
                       MD5 
                FROM   ResultCTE  
                WHERE  RowNum = 1
            ) T2
            ON T1.MD5 = T2.MD5