NOT EXISTS 不起作用

NOT EXISTS doesn't work

我有一个 table 个国家,我想显示瑞典的所有邻国,我遇到了两个问题。

我的代码是这样的:

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 

返回的 table 看起来像这样:

我想从这个 table 中删除瑞典,所以我尝试使用 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),这意味着我的代码有问题。

那么第一个问题就是,如何删除选中后的Sweden这一行?

当我尝试在 b.cntry_name 之后添加 countries.svg 时发生了同样的事情:

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 时出错的地方有什么提示吗?

跳过你的子查询:

SELECT b.cntry_name
FROM countries as a
JOIN countries as b
ON ST_Distance(a.the_geom,b.the_geom)<10000
   AND b.cntry_name <> 'Sweden'
WHERE a.cntry_name <> 'Sweden'
GROUP BY b.cntry_name

解释:

你的子查询 always returns 行(因为 table countries 有关于瑞典的数据),因此永远无法满足 where 条件.

你的子查询也有语法错误,当你只在 from 子句中给出别名 b 而不是 table 名称时。

我认为这就是必要的。 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不需要。

不需要 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 a.cntry_name <> b.cntry_name
--GROUP BY  b.cntry_name -- should work without GROUP BY

这不是寻找邻国的最佳方式。有些地方边界彼此相距不到 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';