8

Запрос UPDATE в SQL с использованием JOINов

1

Я столкнулся с задачей обновления поля таблицы, используя значение, полученное в результате соединения трех таблиц.

Пример SQL-запроса:

select
    im.itemid,
    im.sku as iSku,
    gm.SKU as GSKU,
    mm.ManufacturerId as ManuId,
    mm.ManufacturerName,
    im.mf_item_number,
    mm.ManufacturerID
from 
    item_master im, group_master gm, Manufacturer_Master mm 
where
    im.mf_item_number like 'STA%'
    and im.sku = gm.sku
    and gm.ManufacturerID = mm.ManufacturerID
    and gm.manufacturerID = 34

Мне нужно обновить значения поля mf_item_number в таблице item_master, используя какие-то значения, которые объединяются в этом запросе.

Как я могу сделать это в MS SQL Server?

5 ответ(ов)

14

В данном SQL-запросе выполняется обновление таблицы item_master с использованием данных из таблиц group_master и Manufacturer_Master. Запрос обновляет столбец mf_item_number в таблице item_master значениями из столбца SKU таблицы group_master, где:

  1. Столбец mf_item_number начинается с 'STA%'.
  2. Идентификатор производителя (manufacturerID) в таблице group_master равен 34.

Обратите внимание, что в секции UPDATE можно использовать алиас таблицы, указанный в секции FROM. В вашем запросе im является корректным алиасом для таблицы item_master.

Обобщенный пример

UPDATE A
SET foo = B.bar
FROM TableA A
JOIN TableB B
    ON A.col1 = B.colx
WHERE ...

Это позволяет обновлять данные из одной таблицы на основе соответствующих значений из другой таблицы.

0

Вы можете использовать приведённый ниже пример обновления таблицы на основе оператора JOIN. Обратите внимание, что в вашем коде есть опечатка в названии таблицы prodductcatagories, а также в c.cateogryid. Вот исправленный пример:

UPDATE p
SET    p.category = c.category
FROM   products p
       INNER JOIN productcategories pg
            ON  p.productid = pg.productid
       INNER JOIN categories c
            ON  pg.categoryid = c.categoryid
WHERE  c.categories LIKE 'whole%'

В этом SQL-запросе мы обновляем столбец category таблицы products, устанавливая его значение равным значению category из таблицы categories, на основании соответствия между ID продуктов и категориями. Убедитесь, что все имена таблиц и столбцов указаны правильно, чтобы избежать ошибок выполнения.

0

Чтобы адаптировать это для MySQL, стоит учесть, что в операторе UPDATE нет FROM-клаузы, но можно использовать JOIN для обновления. Вот как это будет выглядеть:

UPDATE
    item_master im
    JOIN
    group_master gm ON im.sku = gm.sku 
    JOIN
    Manufacturer_Master mm ON gm.ManufacturerID = mm.ManufacturerID
SET
    im.mf_item_number = gm.SKU -- и т.д.
WHERE
    im.mf_item_number LIKE 'STA%'
    AND
    gm.manufacturerID = 34

В этом запросе мы используем несколько соединений (JOIN) для того, чтобы получить необходимые данные из других таблиц и обновить поле mf_item_number в таблице item_master, при этом фильтруя результаты по заданным условиям в WHERE.

0

Один из самых простых способов — использовать общий табличный выражение (так как вы уже на SQL 2005):

with cte as (
select
    im.itemid,
    im.sku as iSku,
    gm.SKU as GSKU,
    mm.ManufacturerId as ManuId,
    mm.ManufacturerName,
    im.mf_item_number,
    mm.ManufacturerID,
    <ваше другое поле>
from 
    item_master im, group_master gm, Manufacturer_Master mm 
where
    im.mf_item_number like 'STA%'
    and im.sku = gm.sku
    and gm.ManufacturerID = mm.ManufacturerID
    and gm.manufacturerID = 34)
update cte set mf_item_number = <ваше другое поле>

Движок выполнения запроса сам определит, как обновить запись.

0

Вы можете указать дополнительные таблицы, используемые для определения того, как и что обновить, с помощью оператора "FROM" в операторе UPDATE. Это делается следующим образом:

UPDATE item_master
SET mf_item_number = (некоторое значение)
FROM 
   group_master AS gm
   JOIN Manufacturer_Master AS mm ON .......
WHERE
 .... (ваши условия здесь)

В операторе WHERE необходимо указать условия и операции объединения для связывания этих таблиц.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь