子查询中不允许用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 ,ScoreFROM 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