在多个条件下更新值

时间:2018-09-24 05:04:58

标签: sql visual-foxpro foxpro

我正在尝试添加几个条件。我想用一个中间值的总和更新base2,我想在中间值和base2上发布一些条件。

我在数据库中手动修改了表。中间值是表中的列之一,是根据base2值计算得出的, 在第一行中,我有一个base2值,我计算得出第一行中间值,现在在第二行中,我需要设置新的base2 =先前的base2 +先前的中间值。这就是为什么我有两个计数器来跟踪项目位置的原因。 Counter1对itemid的索引进行计数,counter2跟踪itemid内的循环计数

问题是如何设置此新的base2。是否可以将新的base2设置在一条线上?还是我必须在上一行中将另一个变量设置为中间值,并将其作为新变量添加到base2?

下面是我想要的,但是有错误(功能缺失)。

UPDATE TABLE2 SET base2=   
    (base2+INTERMEDIATEVALUE WHERE loadingordinal=counter2 AND itemid=counter1)    
WHERE loadingordinal=counter2 +1 AND itemid=counter1

2 个答案:

答案 0 :(得分:0)

我不确定INTERMEDIATEVALUE是什么,但是如果它是一个表,则可以遵循下面的查询,也可以对其进行调整。您可以执行子查询以实现这种条件

$rootScope

答案 1 :(得分:0)

在VFP中,很难通过Update_SQL进行此类更新。幸运的是,有很多方法可以解决该问题,一种方法是使用xBase命令代替(在xBase中,您可以对SQL-UPDATE使用REPLACE。Replace默认对“当前行”进行操作(不包括scope子句)。不要提供任何模式或任何示例数据,因此我只能通过猜测给出一个简单的示例。您的代码如下:

local lnPrevious, lnItemId
lnItemId = -1
Select Table2
Scan
      && Save Current Id (ItemID?)
      lnItemId = Table2.ItemID
      && Do calculation using previous value
      && On first row it is the same as base2
      lnPrevious = base2
      scan While Table2.ItemId = m.lnItemId
          Replace Base2 with m.lnPrevious, ;
                  IntermediateValue with DoCalculation(Base2)
          && Previous value for next row
          lnPrevious = Base2 + IntermediateValue    
      endscan   
      skip -1 && Endscan would move the pointer
Endscan

注意,如果您需要的不仅仅是ItemId(或者可能需要传递Base2和IntermediateValue本身而不是lnPrevious),您也可以执行以下操作:

local loRow
scan 
   scatter to name loRow memo
   scan while table2.ItemId = m.loRow.ItemId
   ...