Обновить таблицу A с информацией о B со значением в качестве имени столбца

0

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)

 );
Теги:

5 ответов

0
Лучший ответ

Лучшая производительность, вероятно, заключается в использовании логики 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 имеет плохую структуру данных. Вместо того, чтобы иметь одну колонку в каждой стране, она должна иметь один ряд для каждой страны.

  • 0
    Я подозреваю, что плохая структура - то, почему ОП задает вопрос. Желаемая структура - это та, которую ОП пытается создать.
1
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
;

http://sqlfiddle.com/#!9/6485d/1

1

Вы должны 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).

Проверьте его здесь

0

Выполнение этого для всех столбцов: -

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

Но вам нужно будет изменить это, когда будет добавлен новый столбец страны

0

Я сделал это в 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;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню