SQL获取第一个匹配的行

Posted

技术标签:

【中文标题】SQL获取第一个匹配的行【英文标题】:SQL getting first matched row 【发布时间】: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。那么每个匹配的行还是第一行?请说清楚。并定义“第一”。 【参考方案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;

相关:

Select first row in each GROUP BY group?

【讨论】:

以上是关于SQL获取第一个匹配的行的主要内容,如果未能解决你的问题,请参考以下文章

SQL IN 子句仅返回以逗号分隔的 ID 列表中具有第一个匹配项的行

iOS:如何传递节中的行索引

sql 从匹配前缀的行中获取所有列。

如何编写oracle SQL查询以特定顺序获取匹配和不匹配的行对(基于键列)

C# 查询 SQL Server 表中的 JSON 列以获取匹配的行

使用Python DictReader获取特定的行和值