我似乎无法找到回答以下问题的方法。我正在使用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
任何想法?
答案 0 :(得分:0)
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,一种方法就是使用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支持LIMIT
clause至少MySQL 3.23,如果我记得很清楚的话。也许甚至以前?无论如何,这意味着很久以前。
SELECT ...
GROUP BY ...
ORDER BY ...
LIMIT 10;