我有一个表国家,我想向瑞典展示所有邻国,我遇到了两个问题。
我的代码是这样的:
SELECT b.cntry_name
FROM countries as a
JOIN countries as b
ON ST_Distance(a.the_geom,b.the_geom)<10000
WHERE a.cntry_name='Sweden'
GROUP BY b.cntry_name
它返回了一个如下表:
我想从此表中删除瑞典,因此我尝试使用NOT EXISTS
:
SELECT b.cntry_name
FROM countries as a
JOIN countries as b
ON ST_Distance(a.the_geom,b.the_geom)<10000
WHERE a.cntry_name='Sweden' AND NOT EXISTS(SELECT b.cntry_name FROM b WHERE b.cntry_name='Sweden')
GROUP BY b.cntry_name
然而,这返回了一个空白网页(我在线进行PostGIS),这意味着我的代码出现了问题。
所以第一个问题是,如何在选择后删除瑞典行?
当我尝试在countries.svg
之后添加b.cntry_name
时发生了同样的事情:
SELECT b.cntry_name,countries.svg
FROM countries as a
JOIN countries as b
ON ST_Distance(a.the_geom,b.the_geom)<10000
WHERE a.cntry_name='Sweden'
GROUP BY b.cntry_name
这也返回了一个空白网页。尝试显示svg时出错的任何提示?
答案 0 :(得分:3)
不需要不存在:
SELECT b.cntry_name
FROM countries as a
JOIN countries as b
ON ST_Distance(a.the_geom,b.the_geom)<10000
WHERE a.cntry_name='Sweden'
AND a.cntry_name <> b.cntry_name
--GROUP BY b.cntry_name -- should work without GROUP BY
答案 1 :(得分:1)
我认为这是必要的。此处不需要NOT EXISTS
:
SELECT b.cntry_name
FROM countries as a
JOIN countries as b
ON ST_Distance(a.the_geom,b.the_geom) < 10000
AND a.cntry_name != b.cntry_name
WHERE a.cntry_name = 'Sweden'
GROUP BY b.cntry_name
我认为最后不需要GROUP BY
。
答案 2 :(得分:0)
这不是寻找邻国的最佳方式。有些地方的边界相距10公里以内,但这些国家不是邻居,所以你会从上面得到误报。更正确,更简洁的是使用ST_Touches。
SELECT b.cntry_name
FROM countries as a, countries as b
WHERE ST_Touches(a.the_geom, b.the_geom)
AND a.cntry_name = 'Sweden';