在R中使用SQL子查询筛选符合特定经度条件的城市
正确SQL子查询实现方案
原SQL的问题分析
IN子查询返回了Name, Longitude两列,但IN仅支持匹配单列值,属于语法错误。- 第二个条件错误重复编写了完整的
SELECT语句,正确逻辑应在同一个WHERE子句中用AND连接两个区间判断条件。 - 不必要嵌套多层子查询,直接针对经度区间做判断更简洁高效。
正确实现方案
方案1:直接子查询判断
SELECT Name, Longitude FROM city WHERE -- 经度处于柏林经度到柏林经度+0.2的区间内 Longitude BETWEEN (SELECT Longitude FROM city WHERE Name = 'Berlin') AND (SELECT Longitude FROM city WHERE Name = 'Berlin') + 0.2 AND -- 经度处于巴黎经度-0.2到巴黎经度的区间内(BETWEEN需确保小值在前) Longitude BETWEEN (SELECT Longitude FROM city WHERE Name = 'Paris') - 0.2 AND (SELECT Longitude FROM city WHERE Name = 'Paris')
方案2:使用WITH子句优化性能(避免重复查询柏林/巴黎经度)
WITH city_coords AS ( SELECT (SELECT Longitude FROM city WHERE Name = 'Berlin') AS berlin_lon, (SELECT Longitude FROM city WHERE Name = 'Paris') AS paris_lon ) SELECT c.Name, c.Longitude FROM city c CROSS JOIN city_coords cc WHERE c.Longitude BETWEEN cc.berlin_lon AND cc.berlin_lon + 0.2 AND c.Longitude BETWEEN cc.paris_lon - 0.2 AND cc.paris_lon
对应的R代码
# 基于方案2的R实现示例 sql7 = "WITH city_coords AS ( SELECT (SELECT Longitude FROM city WHERE Name = 'Berlin') AS berlin_lon, (SELECT Longitude FROM city WHERE Name = 'Paris') AS paris_lon ) SELECT c.Name, c.Longitude FROM city c CROSS JOIN city_coords cc WHERE c.Longitude BETWEEN cc.berlin_lon AND cc.berlin_lon + 0.2 AND c.Longitude BETWEEN cc.paris_lon - 0.2 AND cc.paris_lon" result7 = dbSendQuery(con, sql7) df7 = dbFetch(result7) df7
补充说明
- 若城市名存在模糊匹配需求(如带地区后缀),可将
Name = 'Berlin'改为Name LIKE '%Berlin%',但精确匹配用=查询效率更高。 BETWEEN的参数必须遵循“小值在前、大值在后”的顺序,否则会返回空结果。
内容的提问来源于stack exchange,提问作者Steven Hill
相关产品推荐
相关产品推荐

