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