web-dev-qa-db-ja.com

DB2の2つのテーブルからの重複レコードのリストの検索

PersonテーブルとAddressテーブルがあります。彼らの関係はPerson.AddrId = Address.Id

PersonテーブルにはFirst_nameLast_nameAddrId

AddressテーブルにはAddress1Zipcode、およびId

この列の組み合わせから重複レコードのすべてのリストを取得したいのですが。

以下のクエリを試しました:

SELECT  A.FIRST_NAME, A.LAST_NAME, B.ADDR, B.ZIPCODE, count(1)
FROM  SCHEMA.PERSON A, SCHEMA.ADDRESS B
WHERE 
A.ADDR_ID = B.ID
group by A.FIRST_NAME, A.LASTT_NAME, B.ADDR, B.ZIPCODE 
having count(1) > 1 

残念ながら、これは重複レコードのみを提供します。元のレコードと重複するレコードの両方が欲しい。

1
Prash

SQLが閉じているため、クエリの結果は、さらに使用できる新しいテーブルになります。したがって、重複クエリの結果を元のテーブルと結合できます。以下のようなものがうまくいくはずです:

select t2.*
from (
    SELECT  A.FIRST_NAME, A.LAST_NAME, B.ADDR, B.ZIPCODE
    FROM  SCHEMA.PERSON A
    JOIN  SCHEMA.ADDRESS B
        ON A.ADDR_ID = B.ID
    group by A.FIRST_NAME, A.LASTT_NAME, B.ADDR, B.ZIPCODE 
    having count(1) > 1
) as t1
join ( 
    SELECT  A.*, B.*
    FROM  SCHEMA.PERSON A
    JOIN  SCHEMA.ADDRESS B
        ON A.ADDR_ID = B.ID
) as t2
     on (t1.FIRST_NAME, t1.LAST_NAME, t1.ADDR, t1.ZIPCODE)
      = (t2.FIRST_NAME, t2.LAST_NAME, t2.ADDR, t2.ZIPCODE)

CTEを使用すると、もう少し効率がよくなります。

 with t as (
    SELECT  A.*, B.*
    FROM  SCHEMA.PERSON A
    JOIN  SCHEMA.ADDRESS B
        ON A.ADDR_ID = B.ID
)
select t1.*
from t1
join (
    SELECT  FIRST_NAME, LAST_NAME, ADDR, ZIPCODE
    FROM  T1
    group by FIRST_NAME, LASTT_NAME, ADDR, ZIPCODE 
    having count(1) > 1
) as t2
    on (t1.FIRST_NAME, t1.LAST_NAME, t1.ADDR, t1.ZIPCODE)
     = (t2.FIRST_NAME, t2.LAST_NAME, t2.ADDR, t2.ZIPCODE)

追加の列の名前がわからなかったため、 "、"結合を明示的な結合に置き換えました。*も使用しました。

2
Lennart