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

时间:2014-10-12 05:00:08

标签: sql oracle

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

我需要找出2007年总申请人数排名前10位的机构。以下是我试过的命令:

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; 

我一直收到这个错误:

  

ORA-00933:SQL命令未正确结束   00933. 00000 - " SQL命令未正确结束"   *原因:
  *动作:行错误:10列:1

任何想法?

2 个答案:

答案 0 :(得分:0)

SELECT syntax

SELECT  [DISTINCT | ALL] {* | select_list}
FROM {table_name [alias] | view_name} 
    [{table_name [alias]  | view_name}]...  
[WHERE  condition]
[GROUP BY  condition_list]
[HAVING  condition]
[ORDER BY  {column_name | column_#  [ ASC | DESC ] } .
  • 您的Order By子句应在group by子句
  • 之后 建议
  • Join优先于Cartesian product

CODE

SELECT i.instid, i.instname, i.insttype,SUM(f.TotalNumberApplicants) AS TotalNumberofApplicants, f.year 
FROM INSTITUTION_DIM i
INNER JOIN FACT f ON i.INSTID = f.INSTID
WHERE year = 2007 AND rownum <= 10
GROUP BY i.INSTID,i.INSTNAME,i.INSTTYPE,f.YEAR
ORDER BY f.TOTALNUMBERAPPLICANTS; 

答案 1 :(得分:0)

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

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

事实上,some docs on docs.oracle.com并不是很明显它们实际上与MySQL有关,这种混淆在某种程度上得以维持。也许你陷入了陷阱?

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

的Oracle

对于Oracle,一种方法就是使用pseudo-column 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

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

SELECT ...
GROUP BY ...
ORDER BY ...
FETCH FIRST 10 ROWS ONLY;

的MySQL

MySQL支持LIMIT clause至少MySQL 3.23,如果我记得很清楚的话。也许甚至以前?无论如何,这意味着很久以前。

SELECT ...
GROUP BY ...
ORDER BY ...
LIMIT 10;