2013-08-30 62 views
1

我有一個應用程序(它在軌道上的紅寶石,但它應該沒關係)我在哪裏批量加載項目和每個分支的數量。如何使用sqlite數據庫函數來設置計算值

數據庫是sqlite。

說我有兩個表:項目和數量。

items columns: 
id 
quantity 

quantities columns: 
id 
item_id 
branch_id 
value 

我需要通過在項目表中的所有記錄,以便能夠循環的item.quantity設置爲所有quantity.value的地方ITEM_ID匹配item.id總和

我想知道有一種方法可以在sql查詢(select和update)中完成所有操作,這樣我就不必從數據庫中提取數據,執行計算,然後將更新後的數量寫回每個項目,而不是想使用sql語句和函數將它全部發生在數據庫中。

這是可能在一個SQL查詢功能數據庫端?

example: 
item[1] = {id=>1,quantity=>0} 
quantity[1] = {id=>1,item_id=>1,value=>100,branch_id=>1} 
quantity[2] = {id=>2,item_id=>1,value=>200,branch_id=>2} 
quantity[3] = {id=>3,item_id=>1,value=>300,branch_id=>3} 

item[1].quantity = quantity[1].value + quantity[2].value + quantity[3].value 

回答

0

您可以使用update查詢來做到這一點。在這種情況下,你可以使用相關子查詢來計算量的總和對於一個給定的項目:

update item 
    set quantity = (select sum(value) from quantities where item.id = quantities.item_id); 

編輯:

如果你想加快速度把一個指數quantities(item_id, value)

您也可以在臨時表中總結quantities並改爲使用它。然而,該指數應該足以滿足業績。

+0

太棒了! - 我必須稍微調整它,以獲得正確的表名稱和字段名稱:「更新項目設置數量=(從items.id = quantities.item_id中的數量中選擇總和(值));」我有近10萬件物品和500k數量的數據庫,因此它將需要很長時間,比首先真正的批量加載更長...有沒有一種方法可以進一步優化/加速使用編譯指示語言或類似的東西?我可能會限制執行到剛剛更新的item_ids,但我認爲確保所有項目都正確的一種方法會很好。 – Streamline

+0

順便說一下,這裏是最後的Ruby on Rails活動記錄的基礎聲明,我現在正在使用你的幫助,並將我更新的項目限制爲一個item_ids數組 - > Item.update_all(「quantity = =(select sum(value)from quantity where items.id = quantities.item_id)「,[」id IN(?)「,item_ids])...很好用!謝謝。 – Streamline

0

您正在複製您的數據!這意味着你必須始終保持一切同步。 我寧願從那裏創建一個視圖,並得到總量:

CREATE TABLE items(id, ...); 
CREATE TABLE quantities(id, item_id, branch_id, value, ...); 
CREATE VIEW items_sum AS SELECT items.*, SUM(quantities.value) AS quantity FROM items LEFT JOIN quantities ON items.id=quantities.item_id GROUP BY items.id; 

由於items_sum是一個查詢,您不必更新。 SELECT * FROM items_sum;將返回總量的預期結果。

相關問題