ORA-00923 错误:在预期的地方找不到 FROM 关键字

Posted

技术标签:

【中文标题】ORA-00923 错误:在预期的地方找不到 FROM 关键字【英文标题】:ORA-00923 error: FROM keyword not found where expected 【发布时间】:2016-10-16 10:19:05 【问题描述】:

在计算 Oracle DB 上的保留时,我编写了以下代码:

select 
sessions.sessionDate , 
count(distinct sessions.visitorIdd) as active_users, 
count(distinct futureactivity.visitorIdd) as retained_users,
count(distinct futureactivity.visitorIdd) / count(distinct sessions.visitorIdd)::float as retention
FROM sessions
left join sessions futureactivity on
sessions.visitorIdd=futureactivity.visitorIdd
and sessions.sessionDate = futureactivity.sessionDate - interval '3' day
group by 3;

但我总是收到错误:“ORA-00923:mot-clé FROM 缺席 à l'emplacement prévu”(ORA-00923 FROM 关键字未在预期的地方找到) 你们能帮帮我吗?

【问题讨论】:

【参考方案1】:

Oracle 无法识别 Postgres 的 :: 语法,因此它抱怨在预期的地方找不到缺少的 FROM 关键字。

改用演员表:

count(distinct futureactivity.visitorIdd) / cast(count(distinct sessions.visitorIdd) as float) as retention

【讨论】:

非常感谢,它成功了,但出现了另一个错误:/ 我正在关注此链接中的代码:periscopedata.com/blog/… 新的错误是:“ORA-00979: N'est pas une expression GROUP BY” 这个查询太多 Postgres,在 Oracle 中不起作用。理解它的工作原理,然后自己从头开始编写,比弄清楚翻译要好得多。 会的。非常感谢。感谢您的建议。【参考方案2】:

这是一种更“Oracle”的查询方式:

select s.sessionDate , 
       count(distinct s.visitorIdd) as active_users, 
       count(distinct fs.visitorIdd) as retained_users,
       count(distinct fs.visitorIdd) / count(distinct s.visitorIdd) as retention
from sessions s left join
     sessions fs
     on s.visitorIdd = fs.visitorIdd and
        s.sessionDate = fs.sessionDate - interval '3' day
group by s.sessionDate
order by s.sessionDate;

注意事项:

Oracle 不需要整数除法转换。 group by 应该包含列名,它实际上是“1”,而不是“3”。 较短的表别名使查询更易于编写和阅读。 您可能需要order by,因为结果的顺序不确定。 使用窗口函数编写此查询可能有更好的方法。

【讨论】:

以上是关于ORA-00923 错误:在预期的地方找不到 FROM 关键字的主要内容,如果未能解决你的问题,请参考以下文章

错误:ORA-00923:在预期的地方找不到 FROM 关键字

ORA-00923: 使用 shell 脚本在预期的地方找不到 FROM 关键字

在 Oracle SQL 中使用 CTE(ORA-00923:在预期的地方找不到 FROM 关键字)

从关键字定义,但我仍然得到错误

oracle sql listagg [重复]

ORA-00923: 在 oracle 中未找到预期错误的 FROM 关键字