累积聚合产生令牌未知错误

时间:2018-11-28 15:56:54

标签: sum firebird

我在使用累积聚合的Firebird(嵌入式-版本3.0)数据库时遇到问题。我有下表:

+----+---------+
|ID  |Salary   +
+----+---------+
|1   |10.00    |
+----+---------+
|2   |20.00    |
+----+---------+
|3   |35.00    |
+----+---------+
|4   |10.00    |
+----+---------+

我想添加第三列(cum_sum),其中将包含一个累加的总和,即。:

+----+---------+---------+
|ID  +Salary   +cum_sum  |
+----+---------+---------+
|1   |10.00    |10.00    |
+----+---------+---------+
|2   |20.00    |30.00    |
+----+---------+---------+
|3   |35.00    |65.00    |
+----+---------+---------+
|4   |10.00    |75.00    |
+----+---------+---------+

当我尝试使用以下代码时:

select id, salary, sum(salary) over (order by salary) cum_sum
  from employee
  order by salary

我收到一条消息:

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, column 37.

问题出在哪里?

1 个答案:

答案 0 :(得分:1)

如果使用Firebird 2.5或更早版本,则会出现此错误。窗口函数为introduced in Firebird 3。如果要按照问题所示运行查询,则需要升级到Firebird 3。

在您声称要使用Firebird 3 Embedded时,建议您仔细检查

  1. 如果您的Firebird嵌入式版本实际上是版本3(例如,使用select rdb$get_context('SYSTEM', 'ENGINE_VERSION') from rdb$database;此版本适用于Firebird 2.1及更高版本,并且将报告较早版本的错误)。

    您可能已加载了其他版本的Firebird。如果您在搜索路径上的早期版本具有嵌入式库的其他版本,则可能会发生这种情况。如果您在同一位置具有Firebird 2.5 fbembed.dll和Firebird 3 fbclient.dll,也会发生这种情况。在Firebird 3中,嵌入式与普通客户端统一,并且不再具有单独的库(它需要 additional 库,而不是引擎插件)。但是,大多数Firebird驱动程序会先尝试加载fbembed.dll,然后再回到fbclient.dll。

  2. 如果您实际上是使用嵌入式Firebird连接的,而不是偶然连接到其他版本的Firebird服务器实例(例如select rdb$get_context('SYSTEM', 'NETWORK_PROTOCOL') from rdb$database将报告NULL表示嵌入式,而其他连接的值方法)。

    如果您使用错误的连接字符串或错误地配置了驱动程序,则会发生这种情况。

否则,如果您无法升级,则将需要使用更痛苦的选项来编写为您执行此操作的存储过程(或块),或者诉诸同样痛苦的基于CTE的递归解决方案(具有其他限制)。