【问题标题】:SQL getting first matched rowSQL获取第一个匹配的行
【发布时间】:2017-07-16 16:27:34
【问题描述】:

我有两个巨大的数据库表名称“AR”和“All”,我正在尝试将“AR”中的记录匹配到“All”,注意这里我们没有唯一标识符,所以我正在做一个一种模糊匹配,使用名字、姓氏、dob 和 ssn 来获取匹配项。我的匹配查询正在运行。

All 表有一个“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" 时,输出记录有很多重复的,什么不是。

【问题讨论】:

  • 您忘记提供表定义和 Postgres 版本。一些样本数据和期望的结果也会有很长的路要走。另外,您的描述没有加起来。 All table has a column "MID" which I want to fetch for my every matched record 矛盾:trying to get the first matched record from "All" table along with corresponding MId。那么每个匹配的行还是第一行?请说清楚。并定义“第一”。

标签: sql postgresql inner-join greatest-n-per-group


【解决方案1】:

我认为问题在于您正在使用 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)
;

【讨论】:

    【解决方案2】:

    要从All 获取AR 中每一行的“第一个”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;
    

    相关:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      • 2021-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多