长话短说,我完成了我想列出业务佣金的故事的75%,最后一步是仅显示结果中的5行。
LIMIT子句似乎无法在XD上起作用
-- Top 5 Sales Commissions of 2018 in the Car Business - Employee of the year award
SELECT Emp_IDs, Emp_Name, Sale_Num, Sale_Date, Commission
FROM Sales, Employee_Details, Sales_Comm
WHERE Sales_Comm.EMP_id = Employee_Details.Emp_ID
AND Sales_Comm.Sale_Num = Sales.Sale_No
ORDER BY Commission DESC;
我想选择销售佣金表,将佣金从高到低排序,然后从所有结果中选择5行。
答案 0 :(得分:2)
一种选择是使用ROW_NUMBER
:
SELECT Emp_IDs, Emp_Name, Sale_Num, Sale_Date, Commission
FROM
(
SELECT Emp_IDs, Emp_Name, Sale_Num, Sale_Date, Commission,
ROW_NUMBER() OVER (ORDER BY Commission DESC) rn
FROM Employee_Details ed
INNER JOIN Sales_Comm sc
ON ed.Emp_ID = sc.Sale_Num
INNER JOIN Sales s
ON sc.Sale_Num = s.Sale_No
)
WHERE rn <= 5;
请注意,我已将查询更新为使用现代的显式联接语法,这是近来编写SQL的首选方式。
尽管FETCH FIRST
的运行速度可能比上面的运行速度快,但假设您的Oracle版本支持它,则上面的代码可能具有一个优势。如果您决定重构查询并使用其他指标,则只需要进行很小的更改。例如,如果您想保留排名前5名的佣金,则只需将ROW_NUMBER
换成RANK
(或者也许是DENSE_RANK
)。
答案 1 :(得分:1)
在Oracle中,没有LIMIT
子句。如果您使用的是12C或更高版本,则可以使用FETCH
子句来限制结果数。请参阅修改后的查询的最后一行。这是愚蠢而冗长的,但这是Oracle。
-- Top 5 Sales Commissions of 2018 in the Car Business - Employee of the year award
SELECT Emp_IDs, Emp_Name, Sale_Num, Sale_Date, Commission
FROM Sales, Employee_Details, Sales_Comm
WHERE Sales_Comm.EMP_id = Employee_Details.Emp_ID
AND Sales_Comm.Sale_Num = Sales.Sale_No
ORDER BY Commission DESC
FETCH FIRST 5 ROWS ONLY; --this statement here