如何在SQL现有查询结果中添加另一表的COMMUNITY_AREA_NAME字段
解决方案:关联犯罪数据与普查数据获取社区名称
方法1:子查询 + 显式JOIN
这是最直观的写法,将你原有的查询作为子查询,通过社区编号关联普查表获取名称:
SELECT sub.NUM_OF_CRIMES, sub.COMMUNITY_AREA_NUMBER, c.COMMUNITY_AREA_NAME FROM ( -- 原查询:筛选犯罪数最多的社区 SELECT COUNT(id) AS NUM_OF_CRIMES, COMMUNITY_AREA_NUMBER FROM CHICAGO_CRIME_DATA GROUP BY COMMUNITY_AREA_NUMBER ORDER BY NUM_OF_CRIMES DESC LIMIT 1 ) AS sub JOIN CENSUS_DATA c ON sub.COMMUNITY_AREA_NUMBER = c.COMMUNITY_AREA_NUMBER;
- 子查询
sub会返回你之前得到的结果(犯罪数43、社区编号25) JOIN通过两张表共有的COMMUNITY_AREA_NUMBER字段匹配,直接拉取对应的社区名称
方法2:CTE(公共表表达式)
如果你的数据库支持CTE(如MySQL 8.0+、PostgreSQL、SQL Server等),可以用更易读的结构:
WITH top_crime_community AS ( SELECT COUNT(id) AS NUM_OF_CRIMES, COMMUNITY_AREA_NUMBER FROM CHICAGO_CRIME_DATA GROUP BY COMMUNITY_AREA_NUMBER ORDER BY NUM_OF_CRIMES DESC LIMIT 1 ) SELECT t.NUM_OF_CRIMES, t.COMMUNITY_AREA_NUMBER, c.COMMUNITY_AREA_NAME FROM top_crime_community t JOIN CENSUS_DATA c ON t.COMMUNITY_AREA_NUMBER = c.COMMUNITY_AREA_NUMBER;
方法3:直接关联后聚合
也可以先关联两张表再聚合,注意分组时要包含社区名称(因为聚合字段外的列都要在GROUP BY里):
SELECT COUNT(cd.id) AS NUM_OF_CRIMES, cd.COMMUNITY_AREA_NUMBER, ce.COMMUNITY_AREA_NAME FROM CHICAGO_CRIME_DATA cd JOIN CENSUS_DATA ce ON cd.COMMUNITY_AREA_NUMBER = ce.COMMUNITY_AREA_NUMBER GROUP BY cd.COMMUNITY_AREA_NUMBER, ce.COMMUNITY_AREA_NAME ORDER BY NUM_OF_CRIMES DESC LIMIT 1;
常见问题说明
之前尝试子查询或隐式连接失败,大概率是因为:
- 隐式连接没写对
WHERE关联条件,导致出现笛卡尔积 - 子查询的位置错误,比如没将其作为临时表使用
显式JOIN是更推荐的写法,它明确指定关联逻辑,不容易出错。
内容的提问来源于stack exchange,提问作者BradSparks
相关产品推荐
相关产品推荐

