首页 > 解决方案 > 在重复键上给出无效的令牌

问题描述

我正在尝试name_code从表中employee_migration的数字更新。cdclientclientref

 INSERT INTO employee_migration (name_code)
      Select cl.cdclient 
        From clientref cl 
  Inner Join employee_migration em  
          ON cl.client like upper(em.name)
          ON DUPLICATE KEY UPDATE name_code VALUES (cl.cdclient)

我收到此错误:无效的令牌。

Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 3, column 1.
ON.

标签: sqlfirebird

解决方案


如果您使用Firebird服务器(没有说,但看起来像您的错误文本),那么您有MERGE它的命令。

但是,如果您使用Interbase服务器,那么我不知道您如何在那里编写该语句,请查阅 Interbase 手册:http://docwiki.embarcadero.com/InterBase/2017/en/Statement_and_Function_Reference_(Language_Reference_Guide)

您可以使用服务 -> 服务器属性和日志菜单检查您在IBExpert中使用的服务器。

假设您使用 Firebird 2.1 或更高版本

例如这样的:

MERGE INTO employee_migration dest
USING (
      Select cl.cdclient, em.ID
        From clientref cl 
  Inner Join employee_migration em  
          ON cl.client like upper(em.name)
      ) as src
ON dest.ID = src.ID -- or whatever your key columns are

WHEN MATCHED THEN UPDATE SET dest.namecode = src.cdclient

WHEN NOT MATCHED THEN INSERT (namecode, ID, ....)
    VALUES ( src.cdclient, ...., ...........)

但是,如果没有样本数据,您的请求似乎没有什么实际意义。

您的join条件是cl.client like upper(em.name)-这是“多对多”:对于其中的每一行都clientref可以有许多相应的行,employee_migration反之亦然。

因此,您可能会使用查询中employee_migration as dest的许多候选行来匹配和更新行。src

  • 按照 SQL 标准,它应该立即生成错误。
  • 通过 Firebird 2.x 实现 - 它会一个接一个地进行这些更新,覆盖以前的更新,并且只有最后一个候选行的结果才会保持不变。

推荐阅读