SQL 获取第一个匹配行

SQL getting first matched row

我有两个巨大的数据库 table 名称 "AR" 和 "All",我正在尝试将 "AR" 中的记录匹配到 "All",注意这里我们没有唯一标识符,所以我使用名字、姓氏、出生日期和 ssn 进行一种模糊匹配以获得匹配项。我的匹配查询正在运行。

A​​ll table 有一个列 "MID",我想为我的每个匹配记录获取它,但是当我尝试查询时,我得到了数千条记录。网上查了很多都没搞清楚

我正在尝试从 "All" table 中获取第一条匹配记录以及相应的 MId,对于我的 "AR" table 中的每条记录。有人可以帮我从这里出去吗。我的查询如下:

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" 时,输出记录有很多重复项.

我认为问题在于您正在使用 3 个 OR 条件进行内部联接,因此当一条记录匹配多个条件时,您会得到重复项。尝试在下面你离开的地方加入 "MID" table 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)
;

要为 AR 中的每一行从 All 获取 "first" 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;

相关:

  • Select first row in each GROUP BY group?