MySQL: обновление всех строк в таблице, соответствующих результатам другого запроса - PullRequest
16 голосов
/ 18 сентября 2010

Я написал запрос, возвращающий строки, связывающие Клиенты и 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

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

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, гдеэта связь существует?

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

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

Ответы [ 3 ]

35 голосов
/ 18 сентября 2010

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

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

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 голосов
/ 18 сентября 2010

Предполагается, что ваша первая таблица называется customers, а у тех клиентов, у которых нет продавца, s_id из 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, чтобы убедиться в результатах.

0 голосов
/ 24 октября 2013

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

update TableToUpdate ttu, MyView mv
set ttu.column = mv.column
where ttu.key = mv.key
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...