【问题标题】:sql syntax error with liquibase using join tables使用连接表的 liquibase 出现 sql 语法错误
【发布时间】:2020-07-21 09:37:05
【问题描述】:

我正在使用 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 程序在 hsql 数据库上运行。对我来说,这个脚本也应该适用于 hsqldb,因为它是一个纯 sql 语法。但是我收到了这个错误:

liquibase.exception.DatabaseException:意外令牌:需要内部:SET

【问题讨论】:

  • 我认为没有可以使用的 DBMS,您通常不会以这种方式将连接单独放在 update 语句下。考虑将其移至常规 select,如本例所示:stackoverflow.com/a/1293347/11610186

标签: sql liquibase hsqldb


【解决方案1】:

HyperSQL 数据库未在UPDATE 语句中实现连接。见HSQLDB Update Statement

您需要重新表述该查询。

HyperSQL 中等效的有效查询可能类似于:

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%';

假设子查询是一个“标量子查询”,它应该可以工作。标量表示查询最多返回一行。否则,您需要聚合它。

【讨论】:

  • 好的,但是我做的是纯sql,通常应该可以在hsqldb和mysql上运行,不是吗?
  • @AymenRagoubi 不,UPDATE 的 SQL 标准定义不包括其中的连接。这是 DB2、PostgreSQL、SQL Server、MariaDB 和 MySQL(至少)中可用的非标准 [尽管有用] 扩展。不是 Oracle,不是 HyperSQL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 2020-05-05
  • 2014-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多