0

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

这是一个显示我想要完成的示例

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

这是一个非常简单的例子,但它是我能想出的最好的解释我的情况的例子。如果你想这样想的话,最终目标几乎是一个孩子/父母的关系。任何帮助将不胜感激。

4

2 回答 2

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 intoor insert

于 2013-08-13T17:46:33.223 回答
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
于 2013-08-13T17:44:36.130 回答