0

こんにちは、重複したレコードを特定するために次のクエリを実行しています。

SELECT *
          FROM unique2 P WHERE EXISTS(SELECT 1 FROM unique2 C 
                                    WHERE ( (C.surname) =  (P.surname)) 
                                      AND ( (C.postcode) =  (P.postcode)) 
                                      AND ((( (C.forename) IS NULL OR  (P.forename) IS NULL) 
                                      AND  (C.initials) =  (P.initials)) 
                                        OR  (C.forename) =  (P.forename))
                                      AND ( (C.sex) =  (P.sex) 
                                        OR  (C.title) =  (P.title)) 
                                      AND (( (C.address1))=( (P.address1)) 
                                        OR ( (C.address1))=( (P.address2)) 
                                        OR ( (C.address2))=( (P.address1))
                                        OR  instr(C.address1_notrim, P.address1_notrim) > 0 
                                        OR  instr(P.address1_notrim, C.address1_notrim) > 0)
                                      AND C.rowid < P.rowid);

しかし、このクエリでは、重複レコードに一致する一意のレコード ID を特定できません。重複と、それらの重複が一致する一意のレコード ID (私のテーブルには一意のキーがあります) を識別する方法はありますか?

4

2 に答える 2

1

分析関数を使用してこれを行うこともできます。

select id, num_of_ids, first_id, surname, postcode, dob
from (
    select id,
        count(*) over (partition by surname, postcode, dob) as num_of_ids,
        first_value(id)
            over (partition by surname, postcode, dob order by id) as first_id,
        surname,
        postcode,
        dob
    from promolog
)
where num_of_ids > 1;

あなたのアップデートに基づいて、私はあなたが好きなだけ複雑にすることができる自己参加をすることができると思います:

select dup.*, master.id as duplicate_of
from promolog dup
join promolog master
on master.surname = dup.surname
and master.postcode = dup.postcode
and master.dob = dup.dob
... and <address checks etc. > ...
and master.rowid < dup.rowid;

しかし、多分私はまだ何かが欠けています。名前が示すようにexists、一致するレコードの存在をテストするためのものです。一致したレコードからデータを取得する場合は、ある時点でそれに参加する必要があります。

于 2013-02-21T14:25:23.507 に答える
1
select id
from promolog
where surname, postcode, dob in (
  select surname, postcode,dob
  from (
    select surname, postcode, dob, count(1)
    from promolog
    group by surname,postcode,dob
    having count(1) > 1
  )
)
于 2013-02-21T14:18:19.353 に答える