Частный случай MySQL Ошибка 1093 - Невозможно указать целевую таблицу для обновления в предложении FROM - PullRequest
0 голосов
/ 28 апреля 2020

Следующий запрос (который примерно переводится как «если у клиента есть только одна радиостанция, то он находится в восходящем направлении от маршрутизатора»)

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;

выдает ошибку 1093, как только вы добавляете запрос COUNT. То же самое происходит, когда вы делаете обычное UPDATE (без INNER JOIN) и помещаете ссылку на радио в операторе SELECT в предложении SET после «SET A.Uplink =».

В настоящее время существует запрос функции, чтобы удалить это ограничение на https://bugs.mysql.com/bug.php?id=23353, и для некоторых случаев есть простые обходные пути, такие как this , но я не нашел способа реализовать мой конкретный пример. Есть идеи?

Дастин Судак

1 Ответ

1 голос
/ 28 апреля 2020

Удалите подзапрос из предложения 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';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...