2017-02-25 114 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) 
; 
相关问题