mysql - 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有一个功能请求来消除此限制,并且对于某些情况有简单的解决方法,例如这种情况,但我还没有找到实现我的方法具体的例子。有任何想法吗?
达斯汀·苏达克
解决方案
从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';
推荐阅读
- html - 打印 JSON 字符串并使用 HTML 和 CSS 对其进行格式化
- r - 如何从 data.frame 创建因子变量并在并排图中绘制列
- python - 如果在 Django 的两个字段之一中相关
- javascript - ReactJS 中的列表和键:TypeError:无法读取未定义的属性“映射”
- c++ - 如何在类中创建二维数组元素,然后在其构造函数中指定其维度?
- matlab - 如果循环查找值大于某个阈值的日期
- python - 如何访问python中列表列表的特定部分以与数学模块一起使用
- gradle - kapt 支持 jdk 11 吗?
- kubernetes - VPN 访问集群服务/Pod:除了 openvpn 服务器之外无法 ping 任何东西
- javascript - ReactJS App 在不刷新浏览器的情况下不会更新数据