Совокупные агрегаты выдают токен неизвестной ошибки - PullRequest
0 голосов
/ 28 ноября 2018

У меня проблема с базой данных 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 голосов
/ 28 ноября 2018

Вы получаете эту ошибку, если вы используете Firebird 2.5 или более раннюю версию.Оконные функции были введены в Firebird 3 .Вам нужно будет перейти на Firebird 3, если вы хотите выполнить запрос, как показано в вашем вопросе.

Поскольку вы заявляете, что используете Firebird 3 Embedded, я советую вам тщательно проверить

  1. , если ваша встроенная версия Firebird фактически является версией 3 (например, используйте select rdb$get_context('SYSTEM', 'ENGINE_VERSION') from rdb$database; это работает для Firebird 2.1 и выше и сообщит об ошибке для более ранних версий).

    Возможно, вы загрузили другую версиюЖар-птица.Это может произойти, если у вас есть другая версия встроенной библиотеки ранее в пути поиска.Это также может произойти, если у вас есть Firebird 2.5 fbembed.dll и Firebird 3 fbclient.dll в том же месте.В Firebird 3 встроенный был унифицирован с обычным клиентом и больше не имеет отдельной библиотеки (вместо нее требуются дополнительные библиотеки , плагин движка).Однако большинство драйверов Firebird сначала попытаются загрузить fbembed.dll, прежде чем вернуться к fbclient.dll.

  2. , если вы на самом деле подключаетесь со встроенным Firebird, а не случайно к экземпляру сервера Firebirdдругая версия (например, select rdb$get_context('SYSTEM', 'NETWORK_PROTOCOL') from rdb$database сообщит NULL для встроенного, но значение для других методов подключения).

    Это может произойти, если вы используете неверную строку подключения или неправильно настроили драйвер.

В противном случае, если вы не можете выполнить обновление, вам потребуется использоватьболее болезненный вариант написания хранимой процедуры (или блока), которая делает это для вас, или прибегнуть к столь же болезненным рекурсивным решениям на основе CTE (которые имеют другие ограничения, которые могут помешать).

...