2014-10-17 53 views
0

我使用HP Vertica 7作爲數據倉庫數據庫。模擬SQL中的內部對象

我需要同時更新兩個表。

foreach (row r in table_1) 
{ 
    foreach (row r2 in table_2) 
    { 
    if(r.key1 == r2.key1 && r.key2 ==r2.key2 && r.soldQuantity > r2.Quantity) 
    { 
    updateRowInT1(); //r.Partner = r2.Partner; 
    updateRowInT2(); //r2.Quantity = r2.Quantity - r.soldQuantity; 
    break; 
    } 
    } 
} 

這部分代碼最能描述我需要做什麼。 有沒有辦法在SQL中執行此操作(使用用戶定義的函數)。 由於第二個表中的更改,我無法使用更新和連接。或者我可以嗎?

此外,這是由Pentaho Kettle完成的ETL過程的一部分。也許這種方法可以在這個工具中做到這一點。

感謝

編輯: 上面我已經改變了代碼。

我需要做什麼?

合作伙伴定期銷售。

現在有什麼問題嗎?

當某些SKU在零售店出售時,我可以看到SKU LAST合作伙伴。但是,我工作的公司正在從更多的合作伙伴購買相同的SKU。 緩慢變化尺寸不適用,因爲當我們在SKU上切換合作伙伴時,貨架上仍有一定數量的該SKU。

假設:

FIFO - 先進先出。

因此,對於初始匹配,我需要比較(以日期順序)銷售和購買並減少購買數量。

+1

只需在事務中運行兩個更新即可。 – 2014-10-17 17:40:19

+0

@a_horse_with_no_name它不是第一次完成第一次表更新,而不是第二次? – fenix 2014-10-18 19:41:01

+0

您能否提供更多關於您匹配的條件的信息?你是否通過某種鍵和某些其他條件關聯了table_1和table_2中的數據?當你更新每個表時,你是否試圖用table_1中的數據更新table_2,還是更新更像是將字面值設置爲字段? – woot 2014-10-19 01:49:28

回答

1

您可能應該以更集合的方式思考。

假設我理解你正在嘗試做正確,我會在兩個更新語句做到這一點:

-- Update table_1's Partner based on a row in table_2. 
UPDATE table_1 r 
SET Partner = r2.Partner 
FROM table_2 r2 
WHERE r2.key1 = r.key1 
AND r2.key2 = r.key2; 

-- Reduce the Quantity in table_2 based on table_1's soldQuantity 
UPDATE table_2 r2 
SET Quantity = r2.Quantity - r.soldQuantity 
FROM table_1 r 
WHERE r.key1 = r2.key1 
AND r.key2 = r2.key2 
AND r2.Quantity >= r.soldQuantity; 

-- Both of these should be done in a transaction so it is all or none. Commit the work. 
COMMIT; 

你可以看到SQLFiddle here