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';
我有一个 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';