首页 > 解决方案 > 在 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。有谁知道为什么?

标签: sqlpostgresql

解决方案


你应该在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);

推荐阅读