sql синтаксическая ошибка с liquibase с использованием таблиц соединения - PullRequest
0 голосов
/ 08 апреля 2020

Я использую liquibase, и у меня есть скрипт sql:

   <changeSet id="fileSteps-updateUserIdFromMessage" author="aymen">
    <sql>
        update edi_file_steps fs INNER JOIN GU_User u
        on u.login = SUBSTRING(fs.message,
        locate('[',fs.message)+1,
        LENGTH(fs.message)-locate('[',fs.message)-1)
        set user_id= u.id,
        message= SUBSTRING(fs.message, 0, locate('[',fs.message)-1)
        where message LIKE '%Downloaded%' ;
    </sql>
</changeSet>

Мой скрипт отлично работает с mysql. Но моя java программа работает на базе данных sql. Для меня этот скрипт должен работать и для hsqldb, потому что это чистый sql синтаксис. Но я получаю эту ошибку:

liquibase.exception.DatabaseException: неожиданный токен: требуется INNER: SET

1 Ответ

1 голос
/ 09 апреля 2020
База данных

Hyper SQL не реализует объединения в операторе UPDATE. См. Заявление об обновлении HSQLDB .

Вам потребуется перефразировать этот запрос.

Эквивалентный действительный запрос в Hyper SQL, вероятно, будет выглядеть примерно так:

update edi_file_steps fs
  set user_id = (
    select u-id 
    from GU_User u
    where u.login = SUBSTRING(fs.message, locate('[',fs.message)+1, 
                              LENGTH(fs.message)-locate('[',fs.message)-1)
  ),
  message= SUBSTRING(fs.message, 0, locate('[',fs.message)-1)
where message LIKE '%Downloaded%';

Предполагая, что подзапрос является "скалярным подзапросом", он должен работать. Скалярное означает, что запрос возвращает не более одной строки. В противном случае вам нужно будет его агрегировать.

...