基于位列确定记录优先级的最佳方法

时间:2019-04-05 21:07:17

标签: sql sql-server performance sql-server-2016

通过FK GeoNameId,表GeoNames(未显示)和GeoNameAlternateNames(如下所示)之间存在一对多的关系。给定以下结构,我想获取其中IsPreferredName = 1的alternateName值,如果找不到该值,则使用下一个列IsShortName,如果找不到该记录,则使用下一个列,依此类推。在这种情况下,我希望返回第一行。请记住,我将从GeoNames表加入该表。

GeoNames中有1100万条记录,GeoNamesAlternateNames中有1700万条记录,因此像尼安德特人那样行事是不可接受的解决方案。

与此相关的最佳效果策略是什么?我尝试了分组方式,在每个列上保持联接并合并,在子表中排名,然后我要拔头发了。预先感谢。

enter image description here

1 个答案:

答案 0 :(得分:1)

这是一个优先级查询。您需要每个geonameid排一行,因此请在适当的row_number()子句中使用order by

select t.*
from (select t.*,
             row_number() over (partition by geonameid
                                order by (case when IsPreferredName = 1 then 1
                                               when IsShortName = 1 then 2
                                               . . .
                                          end)
                               ) as seqnum
      from t
     ) t
where seqnum = 1;