SQL Left仅加入第一个匹配
发布时间:2020-12-12 06:56:13 所属栏目:MsSql教程 来源:网络整理
导读:我有一个针对大量连接的大表(行和列)的查询,但是其中一个表有一些重复的数据行导致我的查询出现问题。由于这是来自其他部门的只读实时订阅源,因此我无法修复该数据,但我正在尝试通过它来防止查询中的问题。 鉴于此,我需要将此垃圾数据作为左连接添加到我
我有一个针对大量连接的大表(行和列)的查询,但是其中一个表有一些重复的数据行导致我的查询出现问题。由于这是来自其他部门的只读实时订阅源,因此我无法修复该数据,但我正在尝试通过它来防止查询中的问题。
鉴于此,我需要将此垃圾数据作为左连接添加到我的好查询中。数据集如下所示: 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()聚合函数,但是这也感觉不对。从语法上讲,我在这里做错了吗? 更新: 解决方法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 ... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |