SQL查询求助:查找人口超所有北欧国家的亚洲城市及表关联方法
SQL问题解答
现有代码的问题梳理
- 外层查询的
JOIN逻辑是正确的:通过外键city.CountryCode = country.Code关联两张表,就能同时访问城市、所属国家的属性,用来筛选亚洲城市的逻辑没问题 - 子查询部分存在三处错误:
- 语法不完整,缺少右闭合括号
- 子查询没有关联
country表,直接引用country.Region会触发字段不存在的报错 - 你要实现“高于每一个北欧地区国家人口”的逻辑,需要匹配大于所有目标值的判断规则,当前子查询写法无法满足这个要求
修正后的代码
版本1:匹配原需求(城市人口高于所有北欧国家的总人口)
如果你的需求是筛选出人口比所有北欧国家全国总人口还要高的亚洲城市,直接取北欧国家总人口的最大值做比较即可:
SELECT city.Name FROM wwd.city JOIN wwd.country ON city.CountryCode = country.Code WHERE country.Continent = 'Asia' AND city.population > ( SELECT MAX(Population) FROM wwd.country WHERE Region = 'Nordic' );
版本2:匹配常见相似需求(城市人口高于所有北欧地区的城市人口)
如果你的实际需求是筛选出人口比所有北欧城市都高的亚洲城市,子查询也需要关联两张表来筛选北欧地区的城市:
SELECT city.Name FROM wwd.city JOIN wwd.country ON city.CountryCode = country.Code WHERE country.Continent = 'Asia' AND city.population > ( SELECT MAX(c.population) FROM wwd.city c JOIN wwd.country co ON c.CountryCode = co.Code WHERE co.Region = 'Nordic' );
关键逻辑说明
- 外键关联规则:只要你需要同时用两张表的字段做筛选/返回,不管是主查询还是子查询,都需要通过
JOIN+关联条件把两张表的行对应起来 - 大于所有值的判断:要满足“高于每一个目标值”的要求,有两种等价实现:取目标集合的最大值做比较,或者用
> ALL(子查询返回的集合),前者的执行效率通常更高
内容的提问来源于stack exchange,提问作者user15006648
相关产品推荐
相关产品推荐

