【发布时间】:2016-12-20 02:29:16
【问题描述】:
此查询查找每个大陆按面积计算的最大国家/地区。它显示了大陆、名称和区域。
SELECT
c1.continent,
c1.name,
c1.area
FROM
countries c1
WHERE
c1.area = (
SELECT
MAX(c2.area)
FROM
countries c2
WHERE
c1.continent = c2.continent
)
如果我理解正确,子查询会将每个条目的大陆从 c1 匹配到具有相同大陆的所有 c2 条目并找到最大值。如果是这样,将为 c1 中的每个条目运行子查询。这似乎没有必要吗?
谁能解释一下这个查询中发生的事件顺序以及是否有更好的方法来做到这一点。谢谢。
【问题讨论】:
-
您使用的是哪个数据库?我的意思是
Oracle、MySQL或SQL Server? -
@gordon-linoff 的回答是一个非常好的回答。至于更有效的方法,取决于您的 RDBMS,我建议使用连接的 (SELECT i.name, rownum = ROW_NUMBER() OVER (PARTITION BY i.continent ORDER BY i.area DESC) FROM countries i) 的子查询包括 rownum = 1 在内的标准将为您提供每个大陆上最大的国家/地区的名称。
-
@Aruna 我正在使用 Postgres
-
@Forty3 是的,我这周刚刚学习了 PARTITION,我仍在努力解决这个问题
标签: sql postgresql greatest-n-per-group correlated-subquery