我有两个表,每个表都有字段标签,纬度,经度。我想拉出纬度和经度匹配的两个标签。这将创建新表Label1,Label2,Latitude,Longitude。
SELECT Label1, Label2, Round(Latitude2,5) AS Expr1, Round(Longitude2,5) AS Expr2,Round(Latitude1,5) AS Expr3, Round(Longitude1,5) AS Expr4 INTO Merge
FROM [Table1], [Table2]
WHERE (((Round(Latitude2,5))=Round(Latitude1,5)) AND ((Round(Longitude2,5))=Round(Longitude1,5)));
这似乎让我陷入了一个循环,我很确定我理解为什么,但不能完全弄清楚如何得到我想要的东西。
感谢您的帮助!
答案 0 :(得分:1)
正如其中一条评论中提到的那样,在连接条件中使用Round()
函数这一事实意味着数据库引擎无法在经度和纬度字段上使用任何索引(如果这样的索引甚至存在)。这很可能是您遇到的业绩不佳的原因。
我有一个包含两个表的测试用例,每个表有5,000行。 [表1]的结构是
ID - 自动编号,主键
经度1 - 双重
Latitude1 - 双重
Label1 - 文本
[Table2]的结构是相同的,除了这些字段被命名为[Longitude2],[Latitude2]和[Label2]。
当我运行您在问题中发布的查询时,需要10分钟才能完成。
为了加快速度,我在每个表中添加了两个字段:[intLon]和[intLat],它们都被定义为Long Integer并被索引。他们的人口如下:
UPDATE Table1 SET
intLon = Round(Longitude1, 5) * 100000,
intLat = Round(Latitude1, 5) * 100000
UPDATE Table2 SET
intLon = Round(Longitude2, 5) * 100000,
intLat = Round(Latitude2, 5) * 100000
完成后,我们可以使用
获得与初始查询相同的结果SELECT Label1, Label2, Round(Latitude2,5) AS Expr1, Round(Longitude2,5) AS Expr2,Round(Latitude1,5) AS Expr3, Round(Longitude1,5) AS Expr4 INTO Merge
FROM
[Table1]
INNER JOIN
[Table2]
ON Table1.intLon = Table2.intLon
AND Table1.intLat = Table2.intLat
但不是花10分钟执行,而是需要0.8 秒才能运行。