我正在尝试编写一个查询,它将从一个完整的重复表中提取所有不同的记录。我的计划是使用此信息更新我的数据库中的字段,告诉我有特定记录的副本。
这是一个展示我想要完成的事情的例子
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
这是一个非常简单的例子,但它是我能解释我的情况的最佳方法。如果你想以这种方式思考,最终目标几乎就是孩子/父母的关系。任何帮助将不胜感激。
答案 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 into
或insert
。
答案 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