MySQL: обновить все строки в таблице, соответствующие результатам другого запроса

Я написал запрос, возвращающий строки, связывающие Клиенты и Salespeoeple.

Обратите внимание, что запрос объединяет несколько таблиц базы данных. Обратите внимание: не все клиенты имеют продавца.

c_id     c_name   s_id   s_name
  24  microsoft      1     mike
  27        sun      1     mike
  42      apple      2     bill
  44     oracle      1     mike
  47        sgi      1     mike
  58       ebay      2     bill
  61     paypal      3      joe
  65     redhat      1     mike

У меня также есть одна таблица (называемая фактурами) в моей базе данных, которая выглядит так.

i_id   c_id   c_name   s_id   s_name
7208     22   toyota   NULL     NULL
7209     23     ford   NULL     NULL
7210     27      sun   NULL     NULL
7211     42    apple   NULL     NULL
7212     12   nissan   NULL     NULL
7213     15       gm   NULL     NULL
7214     61   paypal   NULL     NULL

Как я могу использовать UPDATE в MySQL, чтобы таблица счетов-фактур выглядела как таблица ниже?

i_id   c_id   c_name   s_id   s_name
7208     22   toyota   NULL     NULL
7209     23     ford   NULL     NULL
7210     27      sun      1     mike
7211     42    apple      2     bill
7212     12   nissan   NULL     NULL
7213     15       gm   NULL     NULL
7214     61   paypal      3      joe

То есть, как я могу обновить таблицу счетов, чтобы включить правильные параметры salesperson_id и salesperson_name, где это отношение существует?

Обратите внимание, что если существует связь Клиент/Продавщик, все счета-фактуры для этого клиента должны иметь связанного с ним продавца, если у этого клиента есть продавец.

Спасибо любезно: -)

Ответы

Ответ 1

Использование подзапросов

Наиболее широко поддерживаемая опция

UPDATE INVOICES
   SET s_id = (SELECT cs.s_id
                 FROM CUSTOMERS_AND_SALES cs
                WHERE cs.c_id = INVOICES.c_id),
       s_name = (SELECT cs.s_name
                   FROM CUSTOMERS_AND_SALES cs
                  WHERE cs.c_id = INVOICES.c_id)
 WHERE INVOICES.c_id IN (SELECT cs.s_id
                           FROM CUSTOMERS_AND_SALES cs)

Использование JOINs

UPDATE INVOICES
  JOIN CUSTOMERS_AND_SALES cs ON cs.c_id = INVOICES.c_id
   SET s_id = cs.s_id,
       s_name = cs.s_name

Ответ 2

Предполагая, что ваша первая таблица имеет имя customers, и те клиенты, у которых нет продавца, имеют s_id of NULL

UPDATE invoices JOIN customers USING (c_id)
SET invoices.s_id = customers.s_id, invoices.s_name = customers.s_name
WHERE customers.s_id IS NOT NULL;

Я предлагаю тестирование в разработке или запуск запроса SELECT, используя сначала JOIN, чтобы обеспечить результаты.

Ответ 3

Вы можете создать представление, чтобы сделать ваш оператор UPDATE простым. Представление должно содержать ваш запрос (в вашем случае запрос, который связывает клиентов и продавцов). Затем обновите таблицу (invoices в вашем случае) следующим образом:

update TableToUpdate ttu, MyView mv
set ttu.column = mv.column
where ttu.key = mv.key