保持价值观

时间:2011-01-02 19:41:25

标签: ms-access ms-access-2003

我有一个简短的问题:我需要一个命令,使用iff语句在更新查询中使某些值保持不变。 关于我的问题的一些背景:我有一个更新查询很长,有19个iff语句。 Iff语句看起来像这样;

UPDATE  1963
SET ProductCode = IIF(
        (ProductCode >=  8410 and ProductCode <= 8421),
        18,   and so on...

所以基本上我是根据同一字段中的值更新字段。当我运行代码Access 2003给出“表达式太复杂”错误。由于我不能一次运行所有代码,我认为我可以将代码分成两部分并单独运行。但是一旦我运行第一部分,因为这是一个iff语句,代码的第一部分中未指定的值变为null。因此我无法运行代码的第二部分,因为我无法为第二部分指定产品代码的范围(它们都变为null) 所以我需要一种方法来使未指定的值保持与第一部分中的相同,因此我可以运行第二部分来完成代码。 这就是我需要说的是if(ProductCode&gt; = 8410和ProductCode&lt; = 8421)设置产品代码= 18,否则不要更改值。 提前谢谢。

3 个答案:

答案 0 :(得分:1)

如果您有多个If语句,则应该查看您正在使用的方法。在这种情况下,我建议您使用包含当前值和您希望更改的值的表,如上一篇文章中所建议的那样。如果不合适,你不需要一个范围,简单的一对一匹配并不困难。

新表:

Code  ChangeTo
8410    18
8321    18
7865     1

您的查询将类似于:

UPDATE MyTable 
INNER JOIN NewTable 
ON MyTable.Code = NewTable.Code
SET MyTableCode = NewTable.ChangeTo

答案 1 :(得分:1)

我会将IIF条件移动到where子句,并将ProductCode的高限和低限制以及新值转换为参数。然后在具有不同参数的代码中运行查询19次。如果你有一个SQL Server后端,那么会有更优雅的方法来实现这一点,但对于纯粹的Access解决方案,你可以更好地保持查询逻辑简单并弥补一些VBA代码的差异。

答案 2 :(得分:0)

尝试创建临时表以设置新值,然后执行有关临时表的更新。

根据旧表的相同结构创建新表[NewTable]。[没有主键]

Insert into NewTable (ID,field1,field2…..)
Select  ID,  iif(fiedl1condition,    trueValue,falseValue),………
From OldTable 

UPDATE OldTable 
INNER JOIN NewTable 
ON OldTable .ID= NewTable.ID
SET Field1 = NewTable.Field1
Field2 = NewTable.Field2
Field3 = NewTable.Field3

Drop TABLE NewTable