任务是“查找员 worker 数所在的大学 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);
关于sql - WHERE 子句无法识别 FROM 子句中创建的表别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69601354/