MySQL 无法在 FROM 多表连接中指定要更新的目标表

标签 mysql join sql-update

我搜索了好几天如何解决这个错误,同时尝试更新多连接表中的字段,并使用来自同一多连接表集的最短日期。

这是我的更新声明:

update vtiger_projectmilestone 
Inner Join vtiger_projectmilestonecf  ON vtiger_projectmilestone.projectmilestoneid = vtiger_projectmilestonecf.projectmilestoneid
Inner Join vtiger_crmentity ON vtiger_projectmilestone.projectmilestoneid = vtcrmm.crmid
inner join vtiger_project on vtiger_project.projectid = vtiger_projectmilestone.projectid
Inner Join vtiger_crmentity vtcrmp ON vtcrmp.crmid = vtiger_project.projectid

 set vtiger_projectmilestone.projectmilestonedate =
(select min(vtiger_projecttaskcf.cf_779) 
FROM vtiger_projecttask tvpt
Inner Join vtiger_projecttaskcf tvptcf ON tvpt.projecttaskid  = tvptcf.projecttaskid
Inner Join vtiger_projectmilestone tvpm ON tvpm.projectmilestoneid = tvpt.projecttasknumber
Inner Join vtiger_projectmilestonecf vtpmcf ON tvpm.projectmilestoneid = tvpmcf.projectmilestoneid
Inner Join vtiger_crmentity AS vtcrmm ON tvpm.projectmilestoneid = vtcrmm.crmid
Inner Join vtiger_crmentity AS vtcrmt ON tvpt.projecttaskid = vtcrmt.crmid
where tvpm.projectmilestone_no = vtiger_projectmilestone.projectmilestone_no
) 
where vtiger_projectmilestone.projectid = 
(select vtiger_project.projectid from vtiger_project 
INNER JOIN vtiger_crmentity vtcrmp ON vtiger_project.projectid = vtcrmp.crmid
where vtcrmp.deleted = 0 order by vtiger_project.projectid desc limit 1)
and vtcrmp.deleted = 0
and vtcrmm.deleted = 0 
and (vtiger_projectmilestone.projectmilestonedate is null or      vtiger_projectmilestonecf.cf_763 is null) ;

这是一个现实生活中的更新查询,而不仅仅是一个简单的表关系。

我通过创建临时表、插入值、更新目标表并删除临时表来绕过它。

我真的很想把它弄好,因为它会更频繁地出现。

感谢所有帮助。

干杯 伯纳德·贝利

最佳答案

this answer 中所述您不能在子查询中使用目标更新表,正如您在查询中看到的那样

SELECT min(vtiger_projecttaskcf.cf_779) 
FROM vtiger_projecttask tvpt
Inner Join vtiger_projecttaskcf tvptcf ON tvpt.projecttaskid  = tvptcf.projecttaskid
Inner Join 
--using target update table in query
vtiger_projectmilestone tvpm ON tvpm.projectmilestoneid = tvpt.projecttasknumber 
Inner Join vtiger_projectmilestonecf vtpmcf ON tvpm.projectmilestoneid = tvpmcf.projectmilestoneid
Inner Join vtiger_crmentity AS vtcrmm ON tvpm.projectmilestoneid = vtcrmm.crmid
Inner Join vtiger_crmentity AS vtcrmt ON tvpt.projecttaskid = vtcrmt.crmid
where tvpm.projectmilestone_no = vtiger_projectmilestone.projectmilestone_no

但是我认为解决方法是使用您正在更新的表中的数据,因此您可以编写一些 where 条件,而不是使用连接:

SELECT min(vtiger_projecttaskcf.cf_779) 
FROM vtiger_projecttask tvpt
Inner Join vtiger_projecttaskcf tvptcf ON tvpt.projecttaskid  = tvptcf.projecttaskid 
Inner Join vtiger_projectmilestonecf vtpmcf ON tvpm.projectmilestoneid = tvpt.projecttasknumber
Inner Join vtiger_crmentity AS vtcrmm ON tvpt.projecttasknumber = vtcrmm.crmid
Inner Join vtiger_crmentity AS vtcrmt ON tvpt.projecttaskid = vtcrmt.crmid
where tvpm.projectmilestone_no = vtiger_projectmilestone.projectmilestone_no
--using the projectmilestoneid in a where clause
AND tvpt.projecttasknumber=vtiger_projectmilestone.projectmilestoneid 

需要注意的是,您可能会遇到一些性能问题,而且,因为我不知道完整的架构,所以我无法判断在子查询中使用其他表而不是 vtiger_projectmilestone 是否会给您正确的结果

关于MySQL 无法在 FROM 多表连接中指定要更新的目标表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36051232/

相关文章:

php - 在我的 mysql 查询中无法正常工作的地方

mysql - 简化自连接 SQL

mysql - 多种条件下的多次更新

mysql - 如何创建枢轴以避免 ID 重复?

php - 在列 MySQL 中搜索数字

sql - 重写这个子查询?

mysql - MYSQL中如何使用UPDATE和IN?

PHP、MySQL : Is it possible to cache a subquery?

php - 使用查询而不是 PHP 中的循环构建 Mysql 表树

java - [Microsoft][ODBC Microsoft Access 驱动程序] 查询表达式中存在语法错误(缺少运算符)