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 列表中具有第一个匹配项的行
如何编写oracle SQL查询以特定顺序获取匹配和不匹配的行对(基于键列)