0

10000行の単純なテーブルがあります

商品ID | 価格 | price_inc_vat | vat_rate

price の値に基づいて price_inc_vat の値を更新できるようにしたい

私はこれを試しました

UPDATE 1_products AS s3, 
       1_products AS t3

SET    t3.price_inc = ROUND(s3.price*1.3,2)

WHERE  s3.vat_rate = 20 AND t3.vat_rate=20;

エラーは発生しませんが、1/2 時間後にクエリを強制終了する必要があったため、非常に時間がかかっているようです。

4

2 に答える 2

2

なぜ参加するのですか?

UPDATE products SET price_inc_vat = ROUND(price*1.3,2) WHERE vat_rate=20;

更新商品の「税込価格」を別の商品価格に更新して何を達成しようとしているのかよくわかり ませんが、クエリに時間がかかるのは、参加方法が原因です。

mysql> create table t1 (product_id integer unsigned primary key, price decimal(10,2), price_inc_vat decimal(10,2), vat_rate integer unsigned);

mysql> insert into t1 values (1, 1.00, 1.20, 20), (2, 2.00, 2.40, 20), (3, 1.00, 1.30, 30);

mysql> select * from (t1 as s3, t1 as t3) where s3.vat_rate=20 and t3.vat_rate=20;
1   1.00    1.20    20  1   1.00    1.20    20
2   2.00    2.40    20  1   1.00    1.20    20
1   1.00    1.20    20  2   2.00    2.40    20
2   2.00    2.40    20  2   2.00    2.40    20

mysql> select s3.*, t3.*, round(s3.price * 1.3, 2) from (t1 as s3, t1 as t3) where s3.vat_rate=20 and t3.vat_rate=20;
1   1.00    1.20    20  1   1.00    1.20    20  1.30
2   2.00    2.40    20  1   1.00    1.20    20  2.60
1   1.00    1.20    20  2   2.00    2.40    20  1.30
2   2.00    2.40    20  2   2.00    2.40    20  2.60

mysql> update (t1 as s3, t1 as t3) set t3.price_inc_vat=round(s3.price*1.3, 2) where s3.vat_rate=20 and t3.vat_rate=20;

mysql> select * from (t1 as s3, t1 as t3) where s3.vat_rate=20 and t3.vat_rate=20;
1   1.00    1.30    20  1   1.00    1.30    20
2   2.00    1.30    20  1   1.00    1.30    20
1   1.00    1.30    20  2   2.00    1.30    20
2   2.00    1.30    20  2   2.00    1.30    20

以前の価格セットに基づいて製品価格を設定しようとしている場合は、おそらく次のことが物事を明確にするのに役立ちます。

mysql> create table t1 (
  product_id integer unsigned, 
  vat_rate integer unsigned, 
  price decimal(10,2), 
  price_inc_vat decimal(10,2), 
  primary key(product_id, vat_rate)
);

mysql> insert into t1 (product_id, price, price_inc_vat, vat_rate) values (1, 1.00, 1.20, 20), (2, 2.00, 2.40, 20), (1, 1.00, 0, 30), (2, 2.00, 0, 30);

mysql> create temporary table tmp1 like t1;

mysql> insert into tmp1 select * from t1;

mysql> select * from t1;
1       20      1.00    1.20
1       30      1.00    0.00
2       20      2.00    2.40
2       30      2.00    0.00

mysql> select * from tmp1;
1       20      1.00    1.20
1       30      1.00    0.00
2       20      2.00    2.40
2       30      2.00    0.00

mysql> update t1 left join tmp1 on t1.product_id=tmp1.product_id and t1.vat_rate > tmp1.vat_rate set t1.price_inc_vat = round(tmp1.price*(1+t1.vat_rate/100), 2) where tmp1.vat_rate = 20;

mysql> select * from t1;
1       20      1.00    1.20
1       30      1.00    1.30
2       20      2.00    2.40
2       30      2.00    2.60
于 2012-10-22T21:23:31.277 に答える
1

のフィールドと のフィールドがあり、さらにprice別のフィールドがありますか? 必要なときに保存して計算しないのはなぜですか?price_inc_vatvat_ratepricevat_rateprice_inc_vat

また、目標とする VAT が 20% のように見えるのに、なぜ 1.3 を掛けているのですか?

これらすべての論理的な矛盾はさておき、次のことを実行できませんか?

UPDATE products
SET price_inc_vat = ROUND(price * 1.3, 2)
WHERE vat_rate = 20

または、10% のマークアップを無視して、VAT の変更後にすべてを更新するには:

UPDATE products
SET price_inc_vat = ROUND(price * (1+vat_rate/100), 2)
于 2012-10-22T22:36:42.003 に答える