我有两个SQL Server 2016表: 拥有约20万行的客户 有100行的商店
两个表都包含一个地理位置字段。
我需要为每个客户找到最近的商店。
我创建了下面的代码,该代码给出正确的结果,但返回每个商店与客户之间的距离,我只需要为每个客户提供TOP 1。我可以先创建ROW_NUMBER,然后再创建= 1,但是我担心此操作将在cte中创建的数据量以及运行需要多长时间。
select t1.[CustNo_],t1.Latitude, t1.Longitude,t1.GeoLoc
,t2.[ShopCode]
,t1.GeoLoc.STDistance(t2.GeoLoc)/1000 as DistanceApartKM
from #Customers t1
join #Shops t2
on (t1.GeoLoc.STDistance(t2.GeoLoc) <= 10000)
order by t1.[CustNo_], DistanceApartKM
我现在要尝试建议使用Cross Apply,下面是经过修改的代码。
select t1.[CustNo_],t1.Latitude, t1.Longitude,t1.GeoLoc
,x.[ShopCode]
,x.DistanceApartKM
from #Customers t1
cross apply (select top 1 t2.[ShopCode]
,t1.GeoLoc.STDistance(t2.GeoLoc)/1000 as DistanceApartKM
from #Shops t2
where (t1.GeoLoc.STDistance(t2.GeoLoc) <= 10000)
order by DistanceApartKM
) x
order by t1.[CustNo_]