【问题标题】:ORA-00923 error: FROM keyword not found where expectedORA-00923 错误:在预期的地方找不到 FROM 关键字
【发布时间】: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 关键字未在预期的地方找到) 你们能帮帮我吗?

【问题讨论】:

    标签: sql oracle10g


    【解决方案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,因为结果的顺序不确定。
    • 使用窗口函数编写此查询可能有更好的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多