通过FK GeoNameId,表GeoNames(未显示)和GeoNameAlternateNames(如下所示)之间存在一对多的关系。给定以下结构,我想获取其中IsPreferredName = 1的alternateName值,如果找不到该值,则使用下一个列IsShortName,如果找不到该记录,则使用下一个列,依此类推。在这种情况下,我希望返回第一行。请记住,我将从GeoNames表加入该表。
GeoNames中有1100万条记录,GeoNamesAlternateNames中有1700万条记录,因此像尼安德特人那样行事是不可接受的解决方案。
与此相关的最佳效果策略是什么?我尝试了分组方式,在每个列上保持联接并合并,在子表中排名,然后我要拔头发了。预先感谢。
答案 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;