我有一个SQL查询,它查看出生日期,姓氏和名字的soundex以识别重复项。以下查询找到大约8,000行(我假设这意味着大约有8,000个重复记录)。
select dob,last_name,soundex(first_name),count(*)
from clients
group by dob,last_name,soundex(first_name)
having count(*) >1
几乎所有结果的计数都是2,有几个计数为3,显然记录在合并的两个数据库之一中存在两次。
我需要采取的下一步是使用重复标记标记其中一行,并不重要,并用相反的行键标记每一行。有没有办法使用SQL?
答案 0 :(得分:2)
这是一个查询,它不仅会为您提供重复项,还会为您提供插入的第一个ID(假设Id是顺序主键列)和最新的ID。
OTTOMH
select dob, last_name, soundex(first_name) firstnamesoundex, min (Id) OldestId, max (Id) NewestId, Count (*) NumRows
from clients
group by dob,last_name,soundex(first_name)
having count(*) >1
您可以在JOIN中使用它来进行更新
UPDATE Clients
SET OppositeRowId = DuplicateRows.NewestId
FROM
(
select dob, last_name, soundex(first_name) firstnamesoundex, min (Id) OldestId, max (Id) NewestId, Count (*) NumRows
from clients
group by dob,last_name,soundex(first_name)
having count(*) >1
) DuplicateRows
WHERE
DuplicateRows.OldestId = Clients.Id
所有这些都假定您有一个重复。如果你有多个,你将不得不尝试不同的东西。
答案 1 :(得分:2)
好吧,您可以使用SELECT DISTINCT,然后将单行标记为“不重复” - 然后搜索“不重复”的行以查找副本。
答案 2 :(得分:2)
这应该是你所追求的,一次性更新。
UPDATE FROM clients c
INNER JOIN
(
select dob,last_name,soundex(first_name),MIN(id) as keep
from clients
group by dob,last_name,soundex(first_name)
having count(*) >1
) k
ON c.dob=k.dob AND c.last_name=k.last_name AND soundex(c.first_name)=soundex(k.first_name)
SET duplicateid = NULLIF(k.keep, c.id),
hasduplicate = (k.keep = c.id)
假设您有3个未在问题中列出的列