2017-11-22 1 views
0

存在ゲットすべての行:重複した値が、私はそうのようなテーブルを持っているいくつかの異なる列に

id  first_name  last_name  address  city_state_zip 
------------------------------------------------------------------- 
1  Bob   Smith   123 Place Georgetown, TN 38119 
2  Bob   Smith   123 Place Georgetown, TN 38119 
3  Bobby   Smith   123 Place Georgetown, TN 38119 

私は私が持っているすべての行を取得することができますクエリは、この例では、同じことを持って欲しいです名の最初の3文字と姓の最初の3文字と住所のすべての文字とcity/state/zipのすべての文字。これは私が持っているクエリですが、私はそれを実行したとき、私は、ゼロ行が返され得る:

SELECT 
    P1.id, 
    P1.first_name, 
    P1.last_name, 
    P1.address, 
    P1.city_state_zip 
FROM person P1 
JOIN (SELECT 
    id, 
    first_name, 
    last_name 
    FROM person 
    GROUP BY id, 
    first_name, 
    last_name, 
    address, 
    city_state_zip 
    HAVING (count(left(first_name, 3)) > 1 
    AND count(left(last_name, 3)) > 1 
    AND count(address + city_state_zip) > 1)) P2 ON P2.id = P1.id 
+0

は、正規化をご覧ください。これは災害のレシピです。 – Eric

+0

「複製」のみを選択する派生テーブルがあります。 GROUP BYなど – jarlh

+0

入力データの制約や殺されたデータの問題... – jarlh

答えて

1

あなたはサブクエリを必要としない - あなただけの自分自身に対してJOINテーブル、そしてよくあなたのON句を指定する必要があります。

ような何か:

select * 
from person p1 
JOIN person p2 
ON 
    p1.ID != p2.ID -- because you don't want the line to match to itself 
    AND left(p1.first_name,3) = left(p2.first_name,3) 
    AND left(p1.last_name,3) = left(p2.last_name,3) 
    AND ... etc, etc 

は...ああ、あなたがそうでなければ、これは大きなテーブル上の非常に遅いことになるだろう、すべての列/ほとんどのインデックスを持っていることを確認してください。

0

私のテイクは、集約されたバージョンのテーブルに参加することです。集計されたバージョンには、重複した情報しかありません。

SELECT * 
FROM person AS P1 
INNER JOIN (
    --#region 
    SELECT 
     first_name = SUBSTRING(first_name, 1, 3) 
     , last_name = SUBSTRING(last_name, 1, 3) 
     , address 
     , city_state_zip 
    FROM person 
    GROUP BY 
     SUBSTRING(first_name, 1, 3) 
     , SUBSTRING(last_name, 1, 3) 
     , address 
     , city_state_zip 
    HAVING COUNT(*) > 1 
    --#endregion 
) AS P2 
    ON P2.first_name = SUBSTRING(P1.first_name, 1, 3) 
    AND P2.last_name = SUBSTRING(P1.last_name, 1, 3) 
    AND P2.address = P1.address 
    AND P2.city_state_zip = P1.city_state_zip 

それが悪い実行する場合、単独の集約を実行し、@table変数または一時的な#tableに格納し、その上で参加し実行してみてください。

これがどうなる
0

SELECT * FROM person p1 INNER JOIN 
(SELECT SUBSTRING(first_name, 1, 3) first_name, SUBSTRING(last_name, 1, 3)last_name, [address], city_state_zip 
FROM person 
GROUP BY SUBSTRING(first_name, 1, 3) , SUBSTRING(last_name, 1, 3), [address], city_state_zip) 
p2 ON p1.SUBSTRING(first_name, 1, 3) = p2.first_name 
    AND p1.SUBSTRING(last_name, 1, 3) = p2.last_name 
    AND p1.[address] = p2.[address] 
    AND p1.city_state_zip = p2.city_state_zip 
関連する問題