1

我有一个有很多重复记录的表,即 tbl_voter,ID 作为主键,自动递增。还有另一个表 tbl_notes,其中包含每个选民的注释。tbl_notes 可以有每个选民的零个或多个记录。来自 tbl_voter 的 ID 是 tbl_notes 中的外键。

问题是由于选民表中有重复项,注释表中也有重复项。

例如:tbl_voter

ID    Name    Address
01    abc     xyz
02    def     pqr
03    abc     xyz
04    abc     xyz
05    abc     xyz
06    def     pqr

tbl_notes

Noteid    ID     Note
A001      01     aaaaaa
A002      02     bbbbbb
A003      01     cccccc
A004      03     dddddd
A005      03     eeeeee
A006      04     ffffff
A007      05     gggggg
A008      01     hhhhhh

我想找到原始 ID 及其重复项的所有 ID,以便更新 tbl_notes

例如:tbl_voter

ID    Name    Address
01    abc     xyz
02    def     pqr

tbl_notes

Noteid    ID     Note
A001      01     aaaaaa
A002      02     bbbbbb
A003      01     cccccc
A004      01     dddddd
A005      01     eeeeee
A006      01     ffffff
A007      01     gggggg
A008      01     hhhhhh

到目前为止,我试图找到重复的记录,但它给了我原始记录和重复记录。我需要一个返回给我的查询:

RealID     DuplicateID
01         03
01         04
01         05
02         06

我试过的查询:

select *
from tbl_voter a inner join 
(
select id,firstname,lastname,zip,housenumber,COUNT(*) AS dupes  from tbl_voter
where riding = '35019'
group by
firstname,lastname,zip,housenumber
having count(*) > 1 
) b on a.firstname = b.firstname
and a.lastname = b.lastname
and a.zip = b.zip
and a.firstname is not null
and b.firstname is not null
and a.riding='35019'
and a.housenumber=b.housenumber
order by a.firstname asc

如果我将 ID 添加到 select 查询中,它会抛出一个错误,指出 ID 不能在 group by 查询中使用,这是正确的,因为 ID 总是不同的。

考虑了 ID 的查询:

select a.id as realid, b.id as dupid, a.firstname,a.lastname,a.zip,a.housenumber
from tbl_voter a inner join 
(
select id,firstname,lastname,zip,housenumber,COUNT(*) AS dupes  from tbl_voter
where riding = '35019'
group by
id,firstname,lastname,zip,housenumber
having count(*) > 1 
) b on a.firstname = b.firstname
and a.lastname = b.lastname
and a.zip = b.zip
and a.firstname is not null
and b.firstname is not null
and a.riding='35019'
and a.housenumber=b.housenumber
order by a.firstname asc

如果我得到重复的和真实的 ID,我可以更新 tbl_notes。

谢谢,沙尚克

4

2 回答 2

6

我将只专注于查找具有真实 ID 和重复 ID 的表。在基本层面上,您试图找到重复信息的所有 id 对。本质上,我们可以从这张表开始:

RealID     DuplicateID
01         01
01         03
01         04
01         05
03         01
03         03
03         04
03         05
04         01
04         03
04         04
04         05
05         01
05         03
05         04
05         05
02         02
02         06
06         02
06         06

现在,这比您想要的信息要多得多,但是像这样考虑您的表可以大大简化查询。您想在所有非 ID 数据都匹配的 tbl_voter 上创建一个自联接。

接下来,让我们过滤掉很多信息。只需指定 realID 必须小于 DuplicateID,就可以删除很多不必要的信息。然后你的表看起来像这样:

RealID     DuplicateID
01         03
01         04
01         05
03         04
03         05
04         05
02         06

这仍然是多余的信息,但没有那么多。您可以做的最后一件事是消除多余的信息是按duplicateID 分组并选择min(realID)。这将为您提供您正在寻找的表格。该查询如下所示:

Select min(v.id) as RealID, v2.id as DuplicateId
From tbl_voter v join tbl_voter v2
    on v.firstname = v2.firstname
    and v.lastname = v2.lastname
    and v.zip = v2.zip
    and v.firstname is not null
    and v2.firstname is not null
    and v.riding='35019'
    and v.riding = v2.riding
    and v.housenumber=v2.housenumber
    and v.id < v2.id
Group by v2.id
于 2014-07-08T15:27:46.473 回答
0

您可以尝试根据您的键列(不是自动增量列)生成 ROW_NUMBER / RANK 并选择所有 row_number =1 的记录。像下面这样的东西

SELECT id,firstname,lastname,zip,housenumber from (SELECT id,firstname,lastname,zip,housenumber,ROW_NUMBER()OVER(PARTITION BY id,firstname,lastname,zip,housenumber ORDER BY id,firstname,lastname,zip,housenumber ) 作为 rowNumber FROM tbl_voter) WHERE rowNumber=1

于 2014-07-08T15:21:28.983 回答