大型数据库表上的最近邻搜索-SQL和/或ArcGis

大型数据库表上的最近邻搜索-SQL和/或ArcGis,sql,ms-access,geospatial,arcgis,Sql,Ms Access,Geospatial,Arcgis,很抱歉发布了一些可能很明显的信息,但我没有太多的数据库经验。任何帮助都将不胜感激,但请记住,我是初学者:-) 我有一张这样的桌子: 餐桌水果 ID类型Xcoordinate Ycoordinate口味果味 1个苹果3个好的1,5 2橙色5 4坏2,9 3苹果7 77中等1,4 4香蕉4 69坏9,5 5梨9 15中等0,1 6苹果3 38良好-5,8 7苹果1 4好3 8香蕉15 99坏6,8 9梨298 18789中等10,01 ……… 1000苹果13441388坏5 ……… 1958香蕉7

很抱歉发布了一些可能很明显的信息,但我没有太多的数据库经验。任何帮助都将不胜感激,但请记住,我是初学者:-)

我有一张这样的桌子:
餐桌水果
ID类型Xcoordinate Ycoordinate口味果味
1个苹果3个好的1,5
2橙色5 4坏2,9
3苹果7 77中等1,4
4香蕉4 69坏9,5
5梨9 15中等0,1
6苹果3 38良好-5,8
7苹果1 4好3
8香蕉15 99坏6,8
9梨298 18789中等10,01
………
1000苹果13441388坏5
………
1958香蕉759 1239良好1
1959年香蕉3 4中等5,2

我需要: 给我一张桌子

距离原始表格中每个点最近的n(例如:n=5)个点,包括距离 表5.5最近距离(请注意,距离是假的)。因此,生成的表具有ID1、ID2以及ID1和ID2之间的距离(遗憾的是,还不能发布图像)。

ID.FROUT1 ID.FROUT2距离 1 1959 1 1 7 2 1 2 2 1 5 30 1 14 50 2 1959 1 2 1 2 … … … 1000 1958 400 1000 Xxx Xxx Xxx

我如何做到这一点(理想情况下使用SQL/数据库管理)或使用ArcGis或类似工具?有什么想法吗? 不幸的是,我的表包含15000个数据集,因此如果我选择n=5,则生成的表将包含75000个数据集。 非常感谢您的建议

编辑:

非常感谢您迄今为止的评论和建议。让我再详细说明一下: 第一种建议的方法是对整个表进行蛮力扫描,呈现巨大的文件大小,或者很可能崩溃,对吗? 现在,水果只是一个虚拟表,实际表包含一个固定ID、标称属性(“水果类型”等)、X和Y空间列(用高斯-克鲁格表示)和一些数字属性。
现在,我想有一种方法可以将一个“边界框”编码到这个中,所以距离计算是针对我所讨论的点(假设为1)和具有特定边长度的正方形内的每个其他点进行的。我可以想象(远程)为此进行编码或查询,但如何让脚本为ID列中的每个点进行编码或查询呢。按照我的理解,这应该为我的“Table.Fruit”中的每个记录/点创建一个“subtable”,包含记录/点周围正方形内的所有点,并添加一个距离字段,或者创建一个新的大表(“Table.5nearest”)。我希望这有点道理。有什么想法吗?再次感谢

获取所有水果之间的距离非常简单。在Access SQL中(尽管您可能需要在任何地方添加括号才能使其正常工作:P):

选择1.id,
2.id,
sqr((果2.xcoordinate-果1.xcoordinate)^2)+(果2.ycoordinate-果1.ycoordinate)^2)作为距离
从水果变成水果1
把水果当水果吃
关于果2.id果1.id
按距离排序;

我不知道Access是否有必要的复杂度来限制每种水果的“前n”记录;因此,在您的记录集上,此查询将返回2.25亿条记录(或者,更可能是在尝试时崩溃)

感谢您到目前为止的评论;同时,我还开发了一个预制解决方案,一个名为ArcGis的插件。这真的很容易找到任意点特征的n个最接近的邻居,具有x和y值。所以我希望它能帮助有类似问题的人。 然而,现在它给我留下了一个与数据库更相关的问题。你知道我如何获得任何数据库管理系统(最好是Access)来给我一个所有组合的列表吗?也就是说,如果我有一个在空间中排列15000个水果的点特征,我如何获得所有“纯香蕉社区”(苹果、柠檬等)和所有其他组合?
干杯并致以最良好的祝愿。

也许更好的解决办法是将相邻的水果全部退回特定范围内。Access应该能够通过在连接条件中添加
sqr(((fruit2.xcoordinate-fruit1.xcoordinate)^2)+((fruit2.ycoordinate-fruit1.ycoordinate)^2))
来管理这一点。我还应该提到——这让我有些困扰——您可以更好地规范化数据。field fruit.type应转换为对fruit_type表的引用;同样,对于fruit.taste字段,我完全支持规范化,但这个查询最不需要的是另一个连接。管理一份水果清单并不难,而且名字也很少改变。非常感谢你的回答,Xophmeister和Jeff O。你有选择吗?如果是,您可能希望阅读或
select   fruit1.id,
         fruit2.id,
         sqr(((fruit2.xcoordinate - fruit1.xcoordinate)^2) + ((fruit2.ycoordinate - fruit1.ycoordinate)^2)) as distance
from     fruit as fruit1
join     fruit as fruit2
on       fruit2.id <> fruit1.id
order by distance;