任務是“找到從該大學畢業的員工人數在所有大學中最多的大學 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。有誰知道為什么?
uj5u.com熱心網友回復:
你應該在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);
uj5u.com熱心網友回復:
您可以訪問已設定別名的查詢的列Temp,但無法從中進行選擇,因為您尚未創建視圖。如果要創建臨時視圖,請WITH為此使用子句。
順便說一下,您不應該使用逗號分隔的連接。這是在20世紀80年代和一些使用多年,直到明確連接(語法[INNER] JOIN,LEFT [OUTER] JOIN等等),使它成為1992年的SQL標準為什么反正加入的職員表?
這是解決此問題的一種方法:
select univid, count(*)
from graduate
group by univid
order by count(*) desc
fetch first row with ties;
這是另一個:
select univid, cnt
from
(
select univid, count(*) as cnt, max(count(*)) over () as max_cnt
from graduate
group by univid
) t
where cnt = max_cnt;
這是你嘗試過的:
with t as
(
select univid, count(*) as cnt
from graduate
group by univid
)
select *
from t
where cnt = (select max(cnt) from t);
uj5u.com熱心網友回復:
它應該更簡單。將您的子查詢移動到 CTE,然后按num降序排序并選擇最上面的結果。你并不需要加入Graduate和Employee太。
Btwtemp是一個保留字,所以最好不要將它用作識別符號/名稱。
with tmp as
(
select univid, count(*) as num
from graduate
group by univid
)
select univid
from tmp
order by num desc limit 1;
我認為 CTE 使 SQL 代碼更具可讀性,但您可以在沒有 CTE 的情況下撰寫相同的代碼。
select univid
from
(
select univid, count(*) as num
from graduate
group by univid
) tmp
order by num desc limit 1;
但是,如果關系是一個問題,您最好使用rank@TimBiegeleisen的方法,但仍然沒有join.
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/323649.html
標籤:sql PostgreSQL
