在SQL中模拟For inside For

时间:2014-10-17 15:06:32

标签: sql pentaho etl kettle vertica

我使用HP Vertica 7作为数据仓库数据库。

我需要同时更新两个表。

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 Partner。但是,我工作的公司是从更多的合作伙伴处购买相同的SKU。 慢慢改变尺寸不适用,因为当我们在SKU上切换合作伙伴时,货架上仍有一定数量的SKU。

假设:

FIFO - 先进先出。

因此,对于初始匹配,我需要比较(按日期顺序)销售和购买以及减少购买数量。

1 个答案:

答案 0 :(得分: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