sql - WHERE 子句无法识别 FROM 子句中创建的表别名

标签 sql postgresql

任务是“查找员 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/

相关文章:

xml - Postgresql - 在 select 中使用 xpath 时如何将 xml 数据类型更改为整数

mysql - 很长的SQL Query,能不能优化一下

java - MS ACCESS jdbc.odbc 连接。未找到数据源名称/未指定默认驱动程序?

在某些情况下用于抑制 'DELETE FROM table' 的 Postgresql 规则

python - PyGreSQL 与 psycopg2

java - 精细日志记录 org.postgresql.jdbc.PgConnection setAutoCommit = false

c# - 有没有正确的方法来检索 SQL 中的字符串字段

mysql - 从子查询中检索多列

Sql 将文本字段转换为日期字段

postgresql - Postgresql 中列的唯一行