sql - 在 FROM 子句中创建的表的别名在 WHERE 子句中无法识别
问题描述
任务是“找到从该大学毕业的员工人数在所有大学中最多的大学ID”
架构是这样的
Graduate ( EmpId: NUMERIC REFERENCES Employee(EmpId),
UnivId: NUMERIC REFERENCES University(UnivId),
GradYear: NUMERIC)
University ( UnivId: NUMERIC, UnivName: VARCHAR(40))
Employee (EmpId: NUMERIC,
EmpName: VARCHAR(40))
我的查询:
SELECT Temp.UnivId
FROM (SELECT G.UnivId, COUNT(*) as Num
FROM Graduate G, Employee E
WHERE G.EmpId = E.EmpId
GROUP BY G.UnivId) AS Temp
WHERE Temp.Num = (SELECT MAX(Temp.Num) FROM Temp);
当我在 psql 控制台中运行此查询并且软件是 PostgresSQL 时,它返回一个错误,说关系“temp”不存在,并且它指向最后的Temp。有谁知道为什么?
解决方案
你应该在RANK
这里使用:
WITH cte AS (
SELECT g.UnivId, RANK() OVER (ORDER BY COUNT(e.EmpId) DESC) rnk
FROM Graduate g
INNER JOIN Employee e
ON g.EmpId = e.EmpId
GROUP BY g.UnivId
)
SELECT UnivId
FROM cte
WHERE rnk = 1;
请注意,这种方法也可以很好地处理关系,如果它们发生的话。
您当前方法的问题是您在WHERE
子句中引用子查询就好像它是一个独立的表,但事实并非如此。您可以将Temp
子查询移动到 CTE,然后可以使您的方法起作用:
WITH Temp AS (
SELECT G.UnivId, COUNT(*) as Num
FROM Graduate G, Employee E
WHERE G.EmpId = E.EmpId
GROUP BY G.UnivId
)
SELECT Temp.UnivId
FROM Temp
WHERE Temp.Num = (SELECT MAX(Temp.Num) FROM Temp);
推荐阅读
- u-boot - 使用 ELDK 交叉编译器在 fedora 8 上编译 U-boot-1.1.6 时出错
- android - 如何解决 gradle 错误“此项目不使用 Gradle 构建系统”
- sql - SQL Query ORDER BY on column not on select on join tables
- clearcase - ClearCase 使用 CAL 或 clearTool 创建 Web 视图
- javascript - 将 Javascript 从 Codepen 转移到 main.js
- java - Spring集成路由到不同类中的子流
- neo4j - 计算每个 Trip 的关系数
- python - 打印所有能被 7 整除并包含 7 从 0 到 100 的数字
- c# - 在 C# 中停止正在运行的线程时出现异常
- docker - 依次运行两个docker-compose文件,tiangolo镜像