Query
查找提供最多零件的供應商的名稱
我有以下架構:
Suppliers(sid: integer, sname: string, address: string) Parts(pid: integer, pname: string, color: string) Catalog(sid: integer, pid: integer, cost: real)
現在我要做的是獲取目錄中待售商品最多的供應商的名稱。這是一個範例實例:
到目前為止,我所擁有的是:
SELECT S.sid, COUNT(*) AS NUM FROM Catalog C, Suppliers S WHERE C.sid=S.sid GROUP BY S.sid
它返回每個供應商 ID 和他們提供的零件數量,這聽起來是一個好的開始;但是,我不確定從那裡去哪裡。
我試過了:
SELECT Y.sid, MAX(Y.Num) FROM (SELECT S.sid, COUNT(*) AS NUM FROM Catalog C, Suppliers S WHERE C.sid=S.sid GROUP BY S.sid) Y
但這又回來了:
| 席位 | MAX(Y.NUM) | +-----+------------+ | 1 | 5 |
…這是錯誤的。
我真的覺得我已經把這個複雜化了,而且我缺少一個簡單的解決方案。任何幫助表示讚賞。
你沒有指定你的 DBMS,所以這是 ANSI SQL:
select sid, num_products from ( select sid, count(*) as num_products, dense_rank() over (order by count(*) desc) as rnk from catalog group by sid ) t where rnk = 1;
如果您還需要
supplier
表中的資訊,則需要加入它:select s.sname, t.num_products from ( select sid, count(*) as num_products, dense_rank() over (order by count(*) desc) as rnk from catalog group by sid ) t join suppliers s on s.sid = t.sid where t.rnk = 1;
這實際上取決於您使用的 RDBMS。對於 SQL Server,它將是:
SELECT TOP 1 main.* FROM (SELECT S.sid, COUNT(*) AS NUM FROM Catalog C, Suppliers S WHERE C.sid=S.sid GROUP BY S.sid) main ORDER BY main.NUM DESC
使用 Oracle,它將類似於:
SELECT TOP 1 main.* FROM (SELECT S.sid, COUNT(*) AS NUM FROM Catalog C, Suppliers S WHERE C.sid=S.sid GROUP BY S.sid ORDER BY main.NUM DESC) main WHERE ROWNUM = 1
這兩個答案的問題在於,他們沒有考慮到兩個供應商是否首先“捆綁”。使用 SQL Server,您可以使用 ROW_NUMBER 或 RANK 之類的東西來處理這個問題。取決於您的 RDBMS 和您的特定需求。