Sql 查找16公里范围内的邮政编码

Sql 查找16公里范围内的邮政编码,sql,tsql,sql-server-2012,geo,geography,Sql,Tsql,Sql Server 2012,Geo,Geography,我有一张表[dbo].[LUPostCode],上面有邮政编码、纬度和经度。27K项记录。 我还有另一个表[dbo]。[LUPostCodeMaster],一个结构相同的主表,有250万条记录 我需要找出[dbo].[LUPostCodeMaster]中的所有邮政编码,它距离[dbo].[LUPostCode]中的邮政编码不到16公里 我正在努力 SELECT C.skMasterPostCode PostCode, M.skMasterPostCode AdjPostCode

我有一张表[dbo].[LUPostCode],上面有邮政编码、纬度和经度。27K项记录。 我还有另一个表[dbo]。[LUPostCodeMaster],一个结构相同的主表,有250万条记录

我需要找出[dbo].[LUPostCodeMaster]中的所有邮政编码,它距离[dbo].[LUPostCode]中的邮政编码不到16公里

我正在努力

SELECT  C.skMasterPostCode PostCode,
        M.skMasterPostCode AdjPostCode
INTO    WorkTable
FROM    [dbo].[LUPostCode] C,
        (
        SELECT [skMasterPostCode],[Latitude],[Longitude] 
        FROM    [dbo].[LUPostCodeMaster]
        ) M --Expected rows --> 70,771,012,410
WHERE   CAST('POINT('+C.Latitude+ ' '+C.Longitude+')' AS GEOGRAPHY).STDistance(CAST('POINT('+M.Latitude+ ' '+M.Longitude+')' AS GEOGRAPHY)) <= 16000
花了这么多时间..我知道用250万交叉加入27K是个坏主意

有谁能提出更好的主意吗

-- DROP TABLE #mytemptable 

SELECT 
 C.UID  AS uidC
,M.UID AS uidM
,CAST('POINT(' + C.Latitude + ' ' + C.Longitude + ')' AS GEOGRAPHY)
.STDistance(CAST('POINT(' + M.Latitude+ ' ' + M.Longitude+')' AS GEOGRAPHY))
 AS distance 
INTO #mytemptable 
FROM LUPostCode AS C
CROSS JOIN LUPostCodeMaster AS M 


DELETE FROM #mytemptable WHERE distance > 16000    


SELECT * FROM #mytemptable 

LEFT JOIN LUPostCode AS C
    ON C.uid = uidC
LEFT JOIN LUPostCodeMaster AS M 
    ON M.uid = uidM
在我的400万条输入样本表上15秒内工作

那么根据 您仍然可以将其移动到CLR函数。 这可能会把时间缩短一半


你还在计算675亿个组合,所以这需要一些时间。

16公里从哪里来?每个请求都会改变吗?我看到的唯一明显的方法是在联接表中计算所有这些,但这将需要大量存储空间!我认为这一定很好,目前我使用的是一组生成的数据。@Liath-您可以从代码点下载邮政编码/位置数据,Open为每个邮政编码单元提供了精确的地理位置Britain@Damien_The_Unbeliever,亲爱的-自从我看了以后,他们一定改变了规则!看起来临时表MyTestable大约有70771012410条记录。这是个问题吗?我试过你的问题。插入到表中花费了1小时30分钟,它仍在运行,所以我停止了。对于较大的数据,可能需要时间。正如我前面提到的,它是27K,250万。@Jithin Shaji:嗯,对675亿个组合进行计算只是需要一些时间。通过使用CLR函数而不是stDistance,您可能可以将时间缩短一半,但仅此而已。你到底想实现什么?有一个即将到来的项目,我需要通过创建一些查找表来做一些准备。我需要一个对照表,每个邮政编码在英国和所有邮政编码在16公里范围内的每个邮政编码