2017-02-25 9 views
0

「AR」と「すべて」の2つのデータベーステーブル名があり、「AR」のレコードを「すべて」に一致させようとしています。ここには一意の識別子はありません。だから私は姓、姓、dobとssnを使ってマッチを得る一種のあいまいなマッチングをしています。私のマッチクエリが機能しています。最初に一致する行を取得するSQL

すべてのテーブルには、一致するすべてのレコードをフェッチしたい「MID」という列がありますが、クエリを実行すると何千ものレコードが取得されます。私はオンラインでたくさん検索しましたが、それを理解できませんでした。

"AR"テーブルのすべてのレコードに対して、対応するMIdとともに "All"テーブルから最初に一致したレコードを取得しようとしています。誰でもここで私を助けることができますか?私のクエリは以下の通りです:

Select distinct a.*, 
     r."MID" 
    from "public"."AR" a 
     inner join "public"."All" r 
      On ( a."cDOB" = r."cDOB" 
       and right(a."SSN",4) = right(r."SSN",4) 
       and left(a."Last Name",4) = left(r."LastName",4) 
       and (a."SSN"!='' or r."SSN"!='') 
      ) 
      OR 
      ( left(a."First Name",4) = left(r."FirstName",4) 
       and ( left(a."Last Name",4) = left(r."LastName",4) 
        OR right(a."Last Name",4) = right(r."LastName",4) 
       ) 
       and ( right(a."SSN",4) = r."SSN" 
        OR a."cDOB" = r."cDOB" 
       ) 
       and ( a."SSN"!='' 
        OR r."SSN"!='' 
       ) 
      ) 
      OR 
      ( a."MelID (Original) " = r."Prp" 
      and a."cDOB" = r."cDOB" 
      and r."Prp"!='' 
      ); 

私はRを削除する場合、クエリは、最初の行から、私は「MID」を正しい出力が得られますが、私はRをフェッチするとき、「MID」の出力レコードが重複してたくさんあります。そして何ではない。

+0

あなたが忘れてしまいましたあなたのtablを提供するeの定義とPostgresのバージョンです。いくつかのサンプルデータと望みの結果は遠くに行きます。また、あなたの説明は追加されません。 'すべてのテーブルには、すべての一致するレコードをフェッチしたい「MID」列があります。「矛盾します:」「すべての」テーブルから最初に一致したレコードを対応するMIdと一緒に取得しようとしています。だから*すべての*一致した行またはちょうど最初の行?どうか明らかにしてください。そして、「最初」を定義します。 –

答えて

0

AR内のすべての行についてAllから "最初の" MIDを取得するには、あなたがDISTINCT ONを使用することができます。

関連
SELECT DISTINCT ON (a.undisclosed_pk_column) 
     a.*, r."MID" 
FROM ... 
... 
ORDER BY a.undisclosed_pk_column, r.undisclosed_columns_defining_first; 

+0

こんにちはありがとうございます。私のために働いていたのは別です。 –

0

私は3つのOR条件で内部結合を行っているので、レコードが複数の条件に一致すると重複が発生することが問題だと思います。 「MID」テーブルへの参加を3回残した場所で、少なくとも1つが一致した場合にのみ結果を保存してください。

Select distinct a.*, 
     nvl(nvl(r."MID",r2."MID"),r3."MID") as MID 
    from "public"."AR" a 
     left join "public"."All" r 
      On ( a."cDOB" = r."cDOB" 
       and right(a."SSN",4) = right(r."SSN",4) 
       and left(a."Last Name",4) = left(r."LastName",4) 
       and (a."SSN"!='' or r."SSN"!='') 
      ) 
     left join "public"."All" r2 
      On ( left(a."First Name",4) = left(r2."FirstName",4) 
       and ( left(a."Last Name",4) = left(r2."LastName",4) 
        OR right(a."Last Name",4) = right(r2."LastName",4) 
       ) 
       and ( right(a."SSN",4) = r2."SSN" 
        OR a."cDOB" = r2."cDOB" 
       ) 
       and ( a."SSN"!='' 
        OR r2."SSN"!='' 
       ) 
      ) 
     left join "public"."All" r3 
      ( a."MelID (Original) " = r3."Prp" 
      and a."cDOB" = r3."cDOB" 
      and r3."Prp"!='' 
      ) 
    WHERE (r."MID" IS NOT NULL OR r2."MID" IS NOT NULL OR r3."MID" IS NOT NULL) 
; 
関連する問題