首页 > 解决方案 > MySQL 错误 1093 的特殊情况 - 无法在 FROM 子句中指定要更新的目标表

问题描述

以下查询(大致翻译为“如果客户只有一个无线电,则它位于路由器的上游”)

UPDATE Devices AS A 
INNER JOIN Devices AS B ON A.CustomerID = B.CustomerID 
SET A.Uplink=B.IPAddress 
WHERE A.DeviceType='Router'  AND  B.DeviceType='Radio' 
AND (
  select count(temp.CustomerID) as total 
  FROM Devices AS temp 
  where temp.DeviceType = 'Radio' AND temp.CustomerID=A.CustomerID
) = 1;

添加 COUNT 查询后立即给出错误 1093。当您执行常规 UPDATE(没有 INNER JOIN)并将对收音机的引用放在“SET A.Uplink=”之后的 SET 子句中的 SELECT 语句中时,也会发生同样的事情。

目前在 https://bugs.mysql.com/bug.php?id=23353有一个功能请求来消除此限制,并且对于某些情况有简单的解决方法,例如这种情况,但我还没有找到实现我的方法具体的例子。有任何想法吗?

达斯汀·苏达克

标签: mysqlsubquery

解决方案


WHERE子句中删除子查询并像这样加入它:

UPDATE Devices AS A 
INNER JOIN Devices AS B ON A.CustomerID = B.CustomerID 
INNER JOIN (
  SELECT CustomerID, COUNT(CustomerID) AS total 
  FROM Devices
  WHERE DeviceType = 'Radio'
  GROUP BY CustomerID
) t ON t.CustomerID = A.CustomerID
SET A.Uplink = B.IPAddress 
WHERE A.DeviceType='Router' AND B.DeviceType='Radio' AND t.total = 1;

或者:

UPDATE Devices AS A 
INNER JOIN Devices AS B ON A.CustomerID = B.CustomerID 
INNER JOIN (
  SELECT CustomerID 
  FROM Devices
  WHERE DeviceType = 'Radio'
  GROUP BY CustomerID
  HAVING COUNT(CustomerID) = 1
) t ON t.CustomerID = A.CustomerID
SET A.Uplink = B.IPAddress 
WHERE A.DeviceType='Router' AND B.DeviceType='Radio';

推荐阅读