2012-10-22 68 views
0

我有10000行更新目錄值爲來自同一個表

的product_id一個簡單的表|價格| price_inc_vat | VAT_RATE

我希望能夠更新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小時後殺死查詢。

+0

愛contentents –

回答

1

讓你有price和現場另一爲price_inc_vat,但另一個爲vat_rate?爲什麼不直接存儲pricevat_rate並在需要時計算price_inc_vat

此外,爲什麼當您定位的增值稅爲20%時,您乘以1.3?

拋開所有這些邏輯不一致,難道你只是做下面的事情嗎?

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

,或者更新增值稅變更後的一切,不顧10%的標記:

UPDATE products 
SET price_inc_vat = ROUND(price * (1+vat_rate/100), 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 
+0

感謝您的快速答覆。我使用代碼根據同一表上不同行的值更新行,但對於大表,行是相同的。 –

+0

我不敢相信你真的想加入與更新自己的表。看短表結果,並請再次告訴如果這是你的預期結果http://sqlfiddle.com/#!2/70531/2/0 –

+0

@SirRufo你的評論是針對StephenBouffe還是我? – Cez