Tabel A:
Id |sku |Country |pricecountry
1 b1 Netherlands *null*
Таблица B:
sku |Germany |France |Netherlands
b1 3,88 7,55 6,14
Целью является обновление столбца pricecountry в таблице A с помощью sku1. В этом случае это должно быть 6,14
Я думаю, что-то вроде этого, но не знаю..
UPDATE tableA as a SET
a.pricecountry = ( select column(a.country)
FROM tableB as b
WHERE a.sku = b.sku and
column(a.country)
);
Лучшая производительность, вероятно, заключается в использовании логики CASE
:
UPDATE tableA a JOIN
tableB b
ON a.sku = b.sku
SET a.pricecountry = (CASE WHEN a.country = 'Netherlands' THEN b.Netherlands
WHEN a.country = 'Germany' THEN b.Germany
WHEN a.country = 'France' THEN b.France
END)
WHERE a.pricecountry IS NULL;
Несмотря на то, что запретный TableB
является разумным, он предотвращает использование индекса на sku
- поэтому он плохо работает.
Обратите внимание, что TableB
имеет плохую структуру данных. Вместо того, чтобы иметь одну колонку в каждой стране, она должна иметь один ряд для каждой страны.
UPDATE
a
INNER JOIN
b
ON a.sku = b.sku
SET
a.price = CASE a.country
WHEN 'germany' THEN b.germany
WHEN 'france' THEN b.france
WHEN 'netherlands' THEN b.netherlands END
WHERE
a.price IS NULL
;
Вы должны UNPIVOT
TableB и JOIN
его TABLEA:
update tableA as A
inner join (
-- unpivot start
select sku, 'Germany' as country, Germany as value
from tableB
union all
select sku, 'France' as country, France as value
from tableB
union all
select sku, 'Netherlands' as country, Netherlands as value
from tableB
-- unpivot end
) as B
on A.country = B.country
and A.sku = B.sku
set A.pricecountry = B.value;
Но поскольку mySQL не имеет функции UNPIVOT
и вам нужно сделать это вручную, используя UNION ALL
, вам следует рассмотреть возможность изменения структуры таблицы (tableB).
Проверьте его здесь
Выполнение этого для всех столбцов: -
UPDATE tableA a
LEFT OUTER JOIN
(
SELECT sku, 'Germany' AS country, Germany AS pricecountry
FROM tableB
UNION
SELECT sku, 'France', France
FROM tableB
UNION
SELECT sku, 'Netherlands', Netherlands
FROM tableB
) b
ON a.sku = b.sku
AND a.country = b.country
SET a.pricecountry = b.pricecountry
Но вам нужно будет изменить это, когда будет добавлен новый столбец страны
Я сделал это в MSSQL:
update a
set a.pricecountry = (case when a.country = 'Netherlands' then b.Netherlands
when a.country = 'Germany' then b.Germany
when a.country = 'France' then b.France end)
from tableA a
inner join tableB b
on a.sku = b.sku
where a.pricecountry is null;