子查询中不允许用order by子句,那么应该怎么办?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了子查询中不允许用order by子句,那么应该怎么办?相关的知识,希望对你有一定的参考价值。

我有一个oracle语句:SELECT t1.SID ,t1.CID ,Score FROM SC t1 WHERE score IN ( SELECT score FROM SC WHERE t1.CID= CID and rownum <=2 ORDER BY score DESC ) ORDER BY t1.CIDORA-00907: missing right parenthesis我在pl/sqldevelop工具执行的时候,报错,内容为:ORA-00907: missing right parenthesis请问,我也没有缺失右括号啊,上文里的括号都是在英文半角模式下输入的,而且,我查阅了一下,说是在子查询中不能用order by子句,那么请问上面的语句应该如何修改呢??

参考技术A SELECT t1.SID ,t1.CID ,Score
FROM SC t1
WHERE score IN ( SELECT score
FROM SC
WHERE t1.CID= CID
and rownum <=2
)
ORDER BY t1.CID

这样试试?都说明了,子查询中不能排序,而且排序也没意义。追问

不明白为什么没意义,
如果这样把order by去掉了,如何能得到前2名的成绩??

追答

出于效率,ORACLE会对IN子查询做DISTINCT,而DISTICT本身就要ORDER,且是ASC方式,所以不再支持加ORDER BY子名。
http://www.2cto.com/database/201201/116777.html
参照这个链接,应该可以用,写了三层嵌套,但是 rownum 跟 order by 没有在一条查询里边用。我本地没有orcale 环境,无法测试。

本回答被提问者采纳

JPA 查询,SQRT 函数在 ORDER BY 子句中不起作用

【中文标题】JPA 查询,SQRT 函数在 ORDER BY 子句中不起作用【英文标题】:JPA query, SQRT function not working in ORDER BY clause 【发布时间】:2021-12-07 04:48:41 【问题描述】:

我有以下 JPA 查询

SELECT p FROM Entity p WHERE p.type = (:type1) AND SQRT((( (:constlong)*(p.longitude - (:long)))*((:constlong)*(p.longitude - (:long)))) + (((:constlat) * (p.latitude - (:lat)))*((:constlat)*(p.latitude - (:lat))))) <= :rad ORDER BY SQRT((( (:constlong)*(p.longitude - (:long)))*((:constlong)*(p.longitude - (:long)))) + (((:constlat) * (p.latitude - (:lat)))*((:constlat)*(p.latitude - (:lat))))) ASC

这个查询在 eclipselink 2.6.9 上运行良好。更新到版本 2.7.9 后,它停止工作。当我删除 ORDER BY 子句时,它再次起作用。 我需要按SQRT 表达式中计算的距离对实体进行排序。

有人可以帮忙吗?

编辑

这是错误:

18:08:58,197 INFO  [stdout] (default task-1) Query error java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: 
18:08:58,197 INFO  [stdout] (default task-1) Exception Description: Syntax error parsing [SELECT p FROM Entity p WHERE p.type = (:type1) AND SQRT((( (:constlong)*(p.longitude - (:long)))*((:constlong)*(p.longitude - (:long)))) + (((:constlat) * (p.latitude - (:lat)))*((:constlat)*(p.latitude - (:lat))))) <= :rad ORDER BY SQRT((( (:constlong)*(p.longitude - (:long)))*((:constlong)*(p.longitude - (:long)))) + (((:constlat) * (p.latitude - (:lat)))*((:constlat)*(p.latitude - (:lat))))) ASC]. 
18:08:58,197 INFO  [stdout] (default task-1) [553, 553] The right parenthesis is missing from the SQRT expression.
18:08:58,197 INFO  [stdout] (default task-1) [635, 640] The query contains a malformed ending.

这里是eclipselink 2.6.4版中生成的sql

SELECT entityid, latitude, longitude FROM public.entity WHERE (((type = ?) OR (type = ?)) AND (SQRT((((? * (longitude - ?)) * (? * (longitude - ?))) + ((? * (latitude - ?)) * (? * (latitude - ?))))) <= ?)) ORDER BY SQRT((((? * (longitude - ?)) * (? * (longitude - ?))) + ((? * (latitude - ?)) * (? * (latitude - ?))))) ASC

在 2.7.7 版本中。没有order by

SELECT entityid, latitude, longitude FROM public.entity WHERE (((type = ?) OR (type = ?)) AND (SQRT((((? * (longitude - ?)) * (? * (longitude - ?))) + ((? * (latitude - ?)) * (? * (latitude - ?))))) <= ?))

2。编辑

我做了一些进一步的挖掘。上面的查询也不适用于 eclipselink 版本 2.6.9。但它肯定适用于 2.6.4 版本。 这两个版本之间发生了一些变化。

【问题讨论】:

你能定义工作和不工作 - 是有错误,还是只是没有返回结果?如果是后一种情况,您能否显示 SQL 并比较使用 EL 2.6.9 和 EL 2.7.9 生成的内容? 我粘贴了错误跟踪。 查询中100%没有不平衡括号。因为相同的查询在旧的 eclipselink 版本中运行良好。 我刚刚粘贴了生成的SQL。 ...令人着迷! ..但是使用simple test like this(v.2.7.9 和您的查询),我可以重现“2 个语法问题”! ..不幸的是,我还用 2.6.9(和相同的查询)复制了它! 【参考方案1】:

我的解决方案是切换到 nativeQuery。 查询如下所示:

getEntityManager().createNativeQuery("SELECT * FROM entity p WHERE (p.type = ?) AND SQRT( (( 71.5*(p.longitude - ?))*( 71.5*(p.longitude - ?))) + (( 111.3 * (p.latitude - ?))*( 111.3*(p.latitude - ?)))) <= 15.0 ORDER BY SQRT( (( 71.5*(p.longitude - ?))*( 71.5*(p.longitude - ?))) + (( 111.3 * (p.latitude - ?))*( 111.3*(p.latitude - ?)))) ASC", Entity.class);

【讨论】:

以上是关于子查询中不允许用order by子句,那么应该怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

在 90 或更高版本的兼容模式下,ORDER BY 子句中不允许使用常量表达式

ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效

ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非 TOP、OFFSET 或 FOR XML

Mysql中ORDER BY 排序怎么使用?指定顺序和多字段排列

oracle不可以用order by么

带有 order by 子句的 SQL 查询