2017-02-25 111 views
0

我有兩個巨大的數據庫表名稱「AR」和「全部」,我試圖將「AR」中的記錄匹配到「全部」,注意這裏我們沒有唯一的標識符,所以我正在使用名字,姓氏,dob和ssn進行一種模糊匹配以獲得匹配。我的匹配查詢正在工作。SQL獲取第一個匹配的行

所有表都有一列「MID」,我想爲每個匹配的記錄提取一列,但是當我嘗試查詢時,我得到了數千條記錄。我在網上搜索了很多,但無法弄清楚。

我想從「全部」表中的第一個匹配的記錄與相應的MID,對於每個記錄在我的「AR」表一起。有人可以幫我從這裏出去嗎。我的查詢是以下:

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」,我想爲我的每一個匹配record'取矛盾:'試圖從「全部」表中的第一個匹配的記錄相應MId'一起。所以*每個*匹配的行或只是第一個?請澄清。並定義「第一」。 –

回答

0

,以獲取 「第一」 MIDAll的每一行中AR,你可以使用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次的地方,只保留至少有一個匹配的結果。

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) 
; 
相關問題