Запрос UPDATE в SQL с использованием JOINов
Я столкнулся с задачей обновления поля таблицы, используя значение, полученное в результате соединения трех таблиц.
Пример 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 ответ(ов)
В данном SQL-запросе выполняется обновление таблицы item_master
с использованием данных из таблиц group_master
и Manufacturer_Master
. Запрос обновляет столбец mf_item_number
в таблице item_master
значениями из столбца SKU
таблицы group_master
, где:
- Столбец
mf_item_number
начинается с'STA%'
. - Идентификатор производителя (
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 ...
Это позволяет обновлять данные из одной таблицы на основе соответствующих значений из другой таблицы.
Вы можете использовать приведённый ниже пример обновления таблицы на основе оператора 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 продуктов и категориями. Убедитесь, что все имена таблиц и столбцов указаны правильно, чтобы избежать ошибок выполнения.
Чтобы адаптировать это для 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
.
Один из самых простых способов — использовать общий табличный выражение (так как вы уже на 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 = <ваше другое поле>
Движок выполнения запроса сам определит, как обновить запись.
Вы можете указать дополнительные таблицы, используемые для определения того, как и что обновить, с помощью оператора "FROM" в операторе UPDATE. Это делается следующим образом:
UPDATE item_master
SET mf_item_number = (некоторое значение)
FROM
group_master AS gm
JOIN Manufacturer_Master AS mm ON .......
WHERE
.... (ваши условия здесь)
В операторе WHERE необходимо указать условия и операции объединения для связывания этих таблиц.
Как выполнить оператор UPDATE с JOIN в SQL Server?
Как выполнить UPDATE с использованием SELECT в SQL Server?
"Вставка результатов хранимой процедуры в временную таблицу"
Выбор COUNT(*) с DISTINCT
Следует ли мне использовать != или <> для обозначения "не равно" в T-SQL?