У меня проблема с обновлением таблицы с помощью select с использованием нескольких соединений. Я чувствую, что все на месте, но я получаю некоторые синтаксические проблемы в конце, как прокомментировано ниже.
UPDATE ambition.ambition_totals a
INNER JOIN (SELECT
c.user AS UserID,
COUNT(*) AS dealers,
ROUND((al.NumberOfDealers / al.NumberOfDealerContacts) * 100 ,2) AS percent
FROM contact_events c
JOIN users u
ON c.user = u.id
JOIN dealers d
ON c.dealer_num = d.dealer_num
LEFT JOIN (
SELECT user_id, COUNT(*) AS NumberOfDealerContacts,
SUM(CASE WHEN ( d.next_call_date + INTERVAL 7 DAY) THEN 1 ELSE 0 END) AS NumberOfDealers
FROM attr_list AS al
JOIN dealers AS d ON d.csr = al.data
WHERE al.attr_id = 14
GROUP BY user_id)) as al
ON al.user_id = a.ext_id -- this is where I have a syntax error
SET a.dealers_contacted = al.dealers,
a.percent_up_to_date = al.percent;
Как показано, я получаю данные, необходимые из этих объединений, но я не могу обновиться в соответствии с моим предложением ON в финальном соединении. Сам выбор работает отдельно от этого, но я просто пытаюсь изменить его, чтобы обновить таблицу.
Я уверен, что я просто пропускаю что-то в синтаксисе, но получаю сообщение о том, что каждая производная таблица должна иметь свой собственный псевдоним.
ОБНОВИТЬ
Исходный рабочий выбор, который необходимо преобразовать в обновление:
SELECT
c.user AS UserID,
COUNT(*) AS Number_of_recorded_events,
ROUND((al.NumberOfDealers / al.NumberOfDealerContacts) * 100 ,2) AS Percentage_up_to_date
FROM contact_events c
JOIN users u
ON c.user = u.id
JOIN dealers d
ON c.dealer_num = d.dealer_num
LEFT JOIN (
SELECT user_id, COUNT(*) AS NumberOfDealerContacts,
SUM(CASE WHEN ( d.next_call_date + INTERVAL 7 DAY) THEN 1 ELSE 0 END) AS NumberOfDealers
FROM jackson_id.attr_list AS al
JOIN jfi_dealers.dealers AS d ON d.csr = al.data
WHERE al.attr_id = 14
GROUP BY user_id) AS al
ON al.user_id = c.user
GROUP BY UserID;
"каждая производная таблица должна иметь свой собственный псевдоним"
Эта ошибка довольно ясна. Производная таблица - это когда вы помещаете подзапрос в предложение FROM или предложение JOIN, которое вы делаете дважды в своем запросе.
Каждый раз, когда вы это делаете, вы должны дать каждому из этих подзапросов таблицы подклассов псевдоним, поэтому вы можете ссылаться на столбцы, возвращаемые подзапросом.
Подобно:
SELECT t.foo FROM (SELECT foo FROM MyTable) AS t
Это необходимо сделать для каждого такого подзапроса. В вашем случае у вас есть что-то вроде этой формы:
UPDATE a
INNER JOIN (
SELECT ... FROM c JOIN u JOIN d
LEFT JOIN (SELECT ... FROM al JOIN d ...)
) AS al
SET ...
У вас есть один уровень подзапроса, который вы даете псевдониму al
.
Но вы не даете псевдоним для самого внутреннего подзапроса, тот, с которым вы делали LEFT JOIN. Для этого тоже нужен псевдоним.
PS: Этот вопрос на самом деле является дубликатом Что такое ошибка "Каждая производная таблица должна иметь свой собственный псевдоним" в MySQL? с 2009 года. Я знаю, что Qaru побуждает нас закрывать новые вопросы как дубликаты, если есть уже старый ответ. Но я также знаю, что на самом деле люди склонны не искать старые должности.
С другой стороны, эта старая статья "Переполнение стека" с 2009 года является буквально первым результатом, когда я google для строки ошибки "каждая производная таблица должна иметь свой собственный псевдоним".
))
поэтому псевдоним применяется к самому внешнему подзапросу. Если вы измените способ отступа своего кода, это может быть более понятным.
)
. ИзменитеGROUP BY user_id) as al
наGROUP BY user_id)) as al