我可以帮您翻译成中文。以下是需要翻译的内容:
对于表 A 中的每个对象,我想要找到表 B 中最近的对象(对象之间的距离最小)。 因此结果应该像这样(这里的距离是随机的……):
我有两个表格,它们都包含具有XY坐标的对象:
表A:
ID_A | X | Y
-----|------|------
100 | 32.2 | 25.6
101 | 36.2 | 22.1
102 | 31.7 | 39.2
103 | 42.7 | 15.6
104 | 24.5 | 29.9
表B:
ID_B | X | Y
-----|------|------
200 | 55.3 | 25.1
201 | 21.5 | 54.2
202 | 67.3 | 66.6
203 | 23.5 | 55.4
204 | 41.1 | 24.5
205 | 42.4 | 62.6
206 | 26.8 | 23.6
207 | 63.2 | 25.6
208 | 35.6 | 11.1
209 | 74.2 | 22.2
210 | 12.2 | 33.3
211 | 15.7 | 44.4
对于表 A 中的每个对象,我想要找到表 B 中最近的对象(对象之间的距离最小)。 因此结果应该像这样(这里的距离是随机的……):
ID_A | ID_B | DISTANCE
-----|------|---------
100 | 203 | 12.5
101 | 203 | 11.1
102 | 211 | 16.5
103 | 205 | 14.2
104 | 209 | 17.7
物体之间的距离:
SQRT( (A.X-B.X)*(A.X-B.X) + (A.Y-B.Y)*(A.Y-B.Y) )
所以我做了这个查询:
SELECT DISTINCT A.ID_A
, FIRST_VALUE (B.ID_B) OVER (PARTITION BY A.ID_A ORDER BY SQRT((A.X-B.X)*(A.X-B.X)+(A.Y-B.Y)*(A.Y-B.Y)) ASC) AS ID_B
, FIRST_VALUE (SQRT((A.X-B.X)*(A.X-B.X)+(A.Y-B.Y)*(A.Y-B.Y))) OVER (PARTITION BY A.ID_A ORDER BY SQRT((A.X-B.X)*(A.X-B.X)+(A.Y-B.Y)*(A.Y-B.Y)) ASC) AS DISTANCE
FROM TableA A, TableB B
这个功能是正常工作的,但问题在于两个表格都有大量数据行(超过500K),因此该查询速度较慢(可能非常低效)。
如何优化此查询?(我正在使用Oracle SQL) 提前感谢。