Синтаксис при обновлении с несколькими объединениями

0

У меня проблема с обновлением таблицы с помощью 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;
  • 4
    Я думаю, что вы короткие а ) . Измените GROUP BY user_id) as al на GROUP BY user_id)) as al
  • 0
    Я применил это только сейчас, но все еще ошибка, я боюсь
Показать ещё 6 комментариев
Теги:

1 ответ

0

"каждая производная таблица должна иметь свой собственный псевдоним"

Эта ошибка довольно ясна. Производная таблица - это когда вы помещаете подзапрос в предложение 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 для строки ошибки "каждая производная таблица должна иметь свой собственный псевдоним".

  • 0
    Может быть, это была путаница. Самое левое соединение - это то, которое я использую как «al».
  • 0
    Но в своем выражении UPDATE вы закрываете два символа:) )) поэтому псевдоним применяется к самому внешнему подзапросу. Если вы измените способ отступа своего кода, это может быть более понятным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню