sql - 在重复键上给出无效的令牌
问题描述
我正在尝试name_code
从表中employee_migration
的数字更新。cdclient
clientref
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.
解决方案
如果您使用Firebird服务器(没有说,但看起来像您的错误文本),那么您有MERGE
它的命令。
但是,如果您使用Interbase服务器,那么我不知道您如何在那里编写该语句,请查阅 Interbase 手册:http://docwiki.embarcadero.com/InterBase/2017/en/Statement_and_Function_Reference_(Language_Reference_Guide)
您可以使用服务 -> 服务器属性和日志菜单检查您在IBExpert中使用的服务器。
假设您使用 Firebird 2.1 或更高版本
- http://en.wikipedia.org/wiki/Merge_(SQL)
- https://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-dml-merge.html
例如这样的:
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 实现 - 它会一个接一个地进行这些更新,覆盖以前的更新,并且只有最后一个候选行的结果才会保持不变。
推荐阅读
- php - 将 ucwords 和 strtoupper 组合在一个字符串中,以符号作为分隔符
- r - 在单独的页面上插入许多图像,并在 rmarkdown 中使用独特的标题
- c# - 如何在 C# 中使用 Draw String 将所有行值打印到 Document
- c# - 项目符号点不是从原始文本框继承的样式
- python - 如何使用 python selenium获取像Test这样的 span 标签中的文本?
- c# - 如何在 winform 应用程序的循环之外杀死一个进程?
- machine-learning - 您如何在机器学习 CNN 架构中捕捉环境或相机设置?
- asp.net-core - 从 Visual Studio 运行 ASP.Net 核心应用程序时出现错误“无法获取 IIS 应用程序池 'xyz' 托管项目 'abc' 的进程 ID”
- java - setArguments 和 getArguments 返回空字符串
- boost - Lanelet2:ImportError:/usr/lib/x86_64-linux-gnu/libboost_python38.so.1.71.0:未定义符号:_Py_tracemalloc_config