Query

查找提供最多零件的供應商的名稱

  • October 31, 2018

我有以下架構:

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;

線上範例:http ://rextester.com/HGL10937

這實際上取決於您使用的 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 和您的特定需求。

引用自:https://dba.stackexchange.com/questions/158371