【发布时间】:2019-09-03 15:36:11
【问题描述】:
我的查询在 SQL Developer 中运行良好,但是当我将相同的查询复制到 MyBatis 的映射器 XML 文件中时,我得到一个 ORA-00900: invalid SQL statement。
映射器文件的子集:
<select id="getTotalUniqueUsersByPage">
resultType="KeyValuePair"
parameterType="RequestFilter">
select KEY as key,sum(single_value) as value from (
select schcm.title as key
,schuc.usage_count AS single_value
from usage_count schuc
inner join content_master schcm
on schcm.trace_id=schuc.trace_key
where schcm.pagetype='Page'
)
GROUP by KEY
order by value desc
</select>
### The error occurred while setting parameters
### SQL: resultType="KeyValuePair" parameterType="RequestFilter"> select KEY as key,sum(single_value) as value from ( select schcm.title as key ,schuc.usage_count AS single_value from usage_count schuc inner join content_master schcm on schcm.trace_id=schuc.trace_key where schcm.pagetype='Page' ) GROUP by KEY order by value desc
### Cause: java.sql.SQLSyntaxErrorException: ORA-00900: invalid SQL statement
在大多数情况下,在 SQL Developer 中运行的常规 SQL 在直接粘贴到 MyBatis 映射器文件时也会运行。好吧,无论如何。我确实记得在末尾检查分号,但这次没有犯那个错误。我希望 MyBatis 调用像 SQL Developer 调用一样工作。
更新: 试过了
<select id="getTotalUniqueUsersByPage">
resultType="KeyValuePair"
parameterType="RequestFilter">
select 'SomeTitle' as "Key", 55 as "Value" from dual
</select>
但是该调用也因相同的“ORA-00900:无效 SQL 语句”而失败。为了尊重下面的 cmets,我将别名括起来,以便保留字“Key”应该起作用,并且确实可以在 SQLDeveloper 中找到.
【问题讨论】:
-
您需要给派生表起别名(括号内的选择)。基本上
... from (select ...) <ALIAS> GROUP by KEY...。我无法想象 SQL 可以在任何地方工作。 -
-
哪个 Oracle 版本?它是否支持 ANSI 连接? ;)
-
@Woodsman,你不需要那对额外的括号。
-
key是保留关键字。你需要引用它select "KEY" as "key" ...