Давайте посмотрим, как эти 2 запроса работают более подробно:
Во-первых, тот, который работает:
/*Works*/
UPDATE tblagent t
SET t.numbersent =
(SELECT SUM(services)
FROM tblservices x
WHERE t.agentid = x.agentid
GROUP BY x.agentid)
Очевидно, что подзапрос должен возвращать одно значение для использования в SETтак что давайте посмотрим на это самостоятельно:
SELECT SUM(services)
FROM tblservices x
WHERE t.agentid = x.agentid
GROUP BY x.agentid
Обратите внимание, что здесь псевдоним "t" соотносит подзапрос с внешним запросом - то есть он имеет одно конкретное значение при оценке подзапроса, например
SELECT SUM(services)
FROM tblservices x
WHERE 123 = x.agentid
GROUP BY x.agentid
Таким образом, хотя результаты запроса группируются по x.agentid, фактически существует только одно значение x.agentid, то есть текущее значение t.agentid (например, 123).Так что это работает.
Теперь посмотрим на подзапрос второго запроса:
SELECT SUM(services)
FROM tblservices x INNER JOIN tblAgent t
ON t.agentid = x.agentid
GROUP BY x.agentid
На этот раз t.agentid не ссылка на внешний запрос,таким образом, этот запрос не соотнесен с внешним запросом.Он может вернуть более 1 строки (просто запустите его и посмотрите), и, таким образом, не может безопасно использоваться в предложении SET внешнего запроса.