SQL Left仅加入第一个匹配

前端之家收集整理的这篇文章主要介绍了SQL Left仅加入第一个匹配前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_403_0@
我有一个针对大量连接的大表(行和列)的查询,但是其中一个表有一些重复的数据行导致我的查询出现问题。由于这是来自其他部门的只读实时订阅源,因此我无法修复该数据,但我正在尝试通过它来防止查询中的问题。

鉴于此,我需要将此垃圾数据作为左连接添加到我的好查询中。数据集如下所示:

IDNo    FirstName   LastName    ...
-------------------------------------------
uqx     bob     smith
abc     john        willis
ABC     john        willis
aBc     john        willis
WTF     jeff        bridges
sss     bill        doe
ere     sally       abby
wtf     jeff        bridges
...

(约24列,100K行)

我的第一直觉是执行一个独特的给了我大约80K行:

SELECT DISTINCT P.IDNo
FROM people P

但是,当我尝试以下操作时,我会收到所有行:

SELECT DISTINCT P.*
FROM people P

要么

SELECT 
    DISTINCT(P.IDNo) AS IDNoUnq,P.FirstName,P.LastName
    ...etc.    
FROM people P

然后我想我会在所有列上执行FIRST()聚合函数,但是这也感觉不对。从语法上讲,我在这里做错了吗?

更新:
只是想注意:这些记录是基于上面列出的非密钥/非索引的ID字段的重复记录。 ID是文本字段,虽然具有相同的值,但它与导致该问题的其他数据的情况不同。

解决方法

distinct不是一个功能。它始终在选择列表的所有列上运行。

您的问题是典型的“每组最大N”问题,可以使用窗口函数轻松解决

select ...
from (
  select IDNo,FirstName,LastName,....,row_number() over (partition by lower(idno) order by firstname) as rn 
  from people 
) t
where rn = 1;

使用order by子句,您可以选择要选择的重复项。

以上可用于左连接:

select ...
from x
  left join (
    select IDNo,row_number() over (partition by lower(idno) order by firstname) as rn 
    from people 
  ) p on p.idno = x=idno and p.rn = 1
where ...

猜你在找的MsSQL相关文章