PostgreSQL中FROM子句定义的表别名无法在WHERE子句识别报错
报错原因
你定义的Temp是外层查询FROM子句中的派生表别名,它的作用域仅局限于外层查询的上下文,无法被WHERE子句内嵌套的独立子查询访问。当你在(SELECT MAX(Temp.Num) FROM Temp)中写FROM Temp时,PostgreSQL会尝试查找名为Temp的物理表、视图或者全局可见的公共表表达式,找不到对应关系就会抛出该报错。
修复方案
方案1:使用CTE(公共表表达式)定义Temp
CTE的作用域覆盖整个查询语句,可直接在后续任意子查询中引用,和你原有逻辑完全兼容:
WITH Temp AS ( SELECT G.UnivId, COUNT(*) as Num FROM Graduate G JOIN Employee E ON G.EmpId = E.EmpId GROUP BY G.UnivId ) SELECT UnivId FROM Temp WHERE Num = (SELECT MAX(Num) FROM Temp);
方案2:使用窗口函数优化查询
用RANK()窗口函数直接按毕业人数排序取首位,不需要重复统计数据,性能更优,同时会自动处理多所大学并列人数第一的场景:
SELECT UnivId FROM ( SELECT G.UnivId, RANK() OVER (ORDER BY COUNT(*) DESC) as rank_num FROM Graduate G JOIN Employee E ON G.EmpId = E.EmpId GROUP BY G.UnivId ) AS t WHERE rank_num = 1;
补充说明:由于
Graduate表的EmpId已设置指向Employee表的外键约束,正常不存在Graduate有EmpId但Employee无对应记录的情况,你可以去掉和Employee表的关联逻辑,直接统计Graduate表即可简化查询。
内容的提问来源于stack exchange,提问作者Nhật Bùi
相关产品推荐
相关产品推荐

