如何让查询仅返回具有最小PriorityId的单条记录?
如何让查询仅返回具有最小PriorityId的单条记录?
嗨,我来帮你捋清楚问题出在哪,以及怎么调整查询得到你想要的结果~
问题根源分析
你当前的查询之所以返回2,'NY'和3,'MA'两条记录,是因为子查询里的关联条件PR.AddressCd = PR2.AddressCd让它变成了按每个AddressCd分组,计算该组内的最小PriorityId。举个例子:
- 对于AddressCd='NY',它的PriorityId是2,组内最小就是2,满足条件
- 对于AddressCd='MA',它的PriorityId是3,组内最小就是3,也满足条件
所以最终两条记录都被筛选出来了,但你想要的是全局范围内最小PriorityId对应的那条记录,对吧?
解决方案
这里给你几种可行的调整方式:
方案1:直接获取全局最小PriorityId
把子查询改成不关联当前行的AddressCd,直接计算整个表的最小PriorityId:
select PR.PriorityId, PR.AddressCd from DMDAddressPriority PR join DMDAddressCity CT on CT.AddressCd = PR.AddressCd where PriorityId = ( select min(PriorityId) from DMDAddressPriority )
因为NJ没有对应的城市记录,JOIN后会被过滤掉,所以最终只会返回2,'NY'这条符合要求的记录。
方案2:使用窗口函数(更灵活)
如果未来可能出现多个相同最小PriorityId的记录,用ROW_NUMBER()窗口函数可以精准控制只取第一条:
select PriorityId, AddressCd from ( select PR.PriorityId, PR.AddressCd, -- 按PriorityId升序编号,最小的会被标为1 ROW_NUMBER() over (order by PR.PriorityId asc) as rn from DMDAddressPriority PR join DMDAddressCity CT on CT.AddressCd = PR.AddressCd ) t where rn = 1
方案3:用TOP 1(适合SQL Server)
如果你用的是SQL Server,直接用TOP 1加排序就能快速得到结果:
select top 1 PR.PriorityId, PR.AddressCd from DMDAddressPriority PR join DMDAddressCity CT on CT.AddressCd = PR.AddressCd order by PR.PriorityId asc
总结
核心区别就是:你原来的查询是分组取最小值,而我们需要的是全局取最小值,调整子查询逻辑或者用上面的方法就能得到你想要的单条记录啦~
备注:内容来源于stack exchange,提问作者Lil SQL
相关产品推荐
相关产品推荐

