在一个 select 语句中使用 group by、order by 和 limit

No *_*ea 2 sql oracle

我似乎无法找到回答以下查询的方法。我正在使用 SQL Developer

我需要找出 2007 年申请者总数排名前十的机构是哪些。以下是我尝试过的命令:

select i.instid, i.instname, i.insttype,sum(f.TotalNumberApplicants)as TotalNumberofApplicants, f.year 
from INSTITUTION_DIM i, FACT f
where i.INSTID = f.INSTID
and year = 2007
order by f.TOTALNUMBERAPPLICANTS
group by i.INSTID,i.INSTNAME,i.INSTTYPE,f.YEAR
limit 10; 
Run Code Online (Sandbox Code Playgroud)

我不断收到此错误:

ORA-00933: SQL 命令未正确结束 00933.00000 - “SQL 命令未正确结束”*原因:
*操作:行:10 列:1 处出错

有任何想法吗??

Syl*_*oux 5

这里可能有些混乱。也许值得花一些时间来澄清这一点?

如今,Oracle 公司同时拥有Oracle 数据库MySQL。这两个产品是不同的数据库服务器。尽管有一些相似之处,但它们的 SQL 实现支持的语法和功能却截然不同。限制查询返回的行数的方法就是其中之一。

从docs.oracle.com 上的一些文档来看,它们实际上与 MySQL 相关,这一事实在某种程度上维持了这种混乱。也许你掉进了这个陷阱?

为了完整起见,这里介绍如何限制 Oracle 和 MySQL 返回的行数:

甲骨文

对于 Oracle,一种方法是使用伪列ROWNUM

SELECT * FROM (
  SELECT ....
  GROUP BY ...
  ORDER BY ...
)
WHERE ROWNUM <= 10
-- Yes, you need a subquery here. But Oracle is smart enough
-- to optimize that statement
Run Code Online (Sandbox Code Playgroud)

从 Oracle 12c 开始,您可以使用该FETCH子句
(直接来自文档,因为我没有足够幸运测试过 Oracle 12)

SELECT ...
GROUP BY ...
ORDER BY ...
FETCH FIRST 10 ROWS ONLY;
Run Code Online (Sandbox Code Playgroud)

MySQL

如果我没记错的话,MySQL至少从 MySQL 3.23 开始就支持该LIMIT子句。也许甚至更早?无论如何,这意味着很久以前。

SELECT ...
GROUP BY ...
ORDER BY ...
LIMIT 10;
Run Code Online (Sandbox Code Playgroud)