NOT EXISTS不起作用

时间:2015-02-16 18:47:32

标签: sql postgis

我有一个表国家,我想向瑞典展示所有邻国,我遇到了两个问题。

我的代码是这样的:

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 

它返回了一个如下表:

enter image description here

我想从此表中删除瑞典,因此我尝试使用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时出错的任何提示?

3 个答案:

答案 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';