You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 10:30:50