Person
テーブルとAddress
テーブルがあります。彼らの関係はPerson.AddrId = Address.Id
Person
テーブルにはFirst_name
、Last_name
、AddrId
。
Address
テーブルにはAddress1
、Zipcode
、および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
残念ながら、これは重複レコードのみを提供します。元のレコードと重複するレコードの両方が欲しい。
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)
追加の列の名前がわからなかったため、 "、"結合を明示的な結合に置き換えました。*も使用しました。