2013-08-30 2 views
1

레일 당 루비이지만 문제가되지 않습니다. 분기 당 항목과 수량을 대량로드하는 곳이 있습니다.계산에서 값을 설정하기 위해 sqlite db 함수를 사용하는 방법

데이터베이스는 sqlite입니다.

두 개의 테이블이 있습니다. 항목 및 수량을 말합니다.

items columns: 
id 
quantity 

quantities columns: 
id 
item_id 
branch_id 
value 

나는

내가 알고 싶습니다 ITEM_ID이 item.id 일치하는 모든 quantity.value의 합에 item.quantity 설정 항목 테이블의 모든 레코드를 반복 할 수 있어야합니다 이 모든 작업을 SQL 쿼리 (select 및 update) 내에서 수행하여 데이터베이스에서 데이터를 가져 와서 계산을 수행 한 다음 업데이트 된 수량을 각 항목에 다시 쓰지 않아도됩니다. 그것은 모든 SQL 문과 함수를 사용하여 데이터베이스에서 발생하도록하고 싶습니다.

SQL 쿼리 함수 db 측에서 가능합니까?

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 = quantity.item_id 인 수량에서 선택 합계 (값);" 나는 거의 100k 항목과 500k 수량을 데이터베이스에 가지고 있으므로 매우 오랜 시간이 걸릴 것입니다. 처음에는 대량로드보다 오래 걸립니다 ... pragma 문이나 비슷한 것을 사용하여 최적화/속도를 향상시키는 방법이 있습니까? 나는 방금 업데이트 된 item_ids로 실행을 제한 할 것이지만 모든 항목이 올바른지 확인하는 방법이 좋을 것이라고 생각했습니다. – Streamline

+0

여기에 마지막 루비 레일에 대한 활성 레코드를 기반으로 성명서 난 지금 당신의 도움으로 사용하고 item_ids의 배열로 업데이 트 항목을 제한 -> Item.update_all ("quantity = (수량에서 합계 선택 (수량) 수량 items.id = quantity.item_id) ", ["id IN (?) ", item_ids]) ... 훌륭한 작품입니다! 감사. – Streamline

0

데이터를 복제하는 중입니다! 이는 항상 모든 것을 동기화시켜야한다는 것을 의미합니다. 나는 거기에서 총 수량을보기를 만들고 얻을 선호 : items_sum으로

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; 

쿼리, 당신이 그것을 업데이트 할 필요가 없습니다. SELECT * FROM items_sum;은 총 수량에 대해 원하는 결과를 반환합니다.

관련 문제