使用嵌套选择删除重复记录

时间:2018-01-20 17:18:58

标签: mysql

从下表中

enter image description here

如何查询以下输出?

enter image description here

我的初步查询是:

select
    bpai.sequence_id, bpai.last_name, bpai.given_name,
    bpai.middle_name, bpai.middle_initial,
    bpai.gender, bpai.birth_date, bpai.birth_place_via_psgc, bpai.citizenship,
    bpai.primary_mobile_number, bpai.primary_email_address, count(*)
    from bpaitbl bpai
    inner join (select 
                    *, count(*) as countof
                    from bpaitbl
                    group by
                        last_name, middle_name,
                        gender, birth_date, citizenship
                    having (count(*) > 1)
     ) profil on bpai.last_name like profil.middle_name 
        and bpai.gender = profil.gender
        and bpai.birth_date = profil.birth_date
        and bpai.citizenship = profil.citizenship        
;

并且无论如何我无法做出输出。请帮忙。

1 个答案:

答案 0 :(得分:0)

由于您在问题中没有说,但在标题中提及结果集所代表的内容,我认为您需要一个包含重复记录的行列表。

以下查询将列出所有具有重复记录的记录,显示重复项的sequence_id最高的记录:

SELECT
    a.sequence_id,
    a.last_name,
    a.given_name,
    a.middle_name,
    a.gender,
    a.birth_date,
    a.citizenship
FROM bpaitbl a
LEFT JOIN bpaitbl b
ON a.last_name = b.last_name AND
    a.given_name = b.given_name AND
    a.middle_name = b.middle_name AND
    a.gender = b.gender AND
    a.birth_date = b.birth_date AND
    a.citizenship = b.citizenship AND
    a.sequence_id > MAX(b.sequence_id)
WHERE b.sequence_id IS NULL;
GROUP BY 
    a.last_name,
    a.given_name,
    a.middle_name,
    a.gender,
    a.birth_date,
    a.citizenship

要显示sequence_id最低的记录,请将>更改为<。如果您想要所有行,包括那些没有重复的行,请删除where子句。