2017-12-19 8 views
0

Tabel A:更新テーブルA列名として

Id |sku |Country  |pricecountry 
1 b1  Netherlands  *null* 

表B:

sku |Germany |France |Netherlands 
b1  3,88  7,55  6,14 

目標はSKU1で、表Aの列pricecountryを更新することです。

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 

しかし、あなたが必要となる - このケースでは、私はこのような何かを考えるが、すべての列のためにそれをやって...

UPDATE tableA as a SET 
a.pricecountry = (select column(a.country) 
         FROM tableB as b 
         WHERE a.sku = b.sku and 
         column(a.country) 

); 
+0

表Bはよく設計されていません。あなたがオプションを持っているなら、正規化しようとするべきです(例えば、sku、country、value) –

+0

@ P.Salmonそれで、Bの構造はAの構造にマッチします。それで、Opは何を達成しようとしているのでしょうか? BをAに正規化しますか? – MatBailie

答えて

0

最高のパフォーマンスがCASEロジックを使用することが考えられます:TableBをアンピボットすることは合理的ではあるが

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; 

を、それがインデックスでの使用を防止sku - これがパフォーマンスにとって悪い理由です。

TableBのデータ構造が不十分であることに注意してください。国ごとに1つの列を持つ代わりに、国ごとに1つの列が必要です。

+0

私はOPが質問している理由は、貧しい構造を疑う。所望の構造は、OPが作成しようとしているようである。 – MatBailie

0

を知らない6,14

する必要があります新しい国の列が追加されるたびにこれを修正する

1

あなたはUNPIVOTテーブルBとJOINテーブルAにする必要があります:

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)の構造を変更することを検討すべきです。

テストそれhere

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

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; 
関連する問題