从另一个表中的另一个字段更新表中的1个字段(OS400,而不是1到1的关系)

时间:2012-10-12 15:45:39

标签: sql db2 sql-update ibm-midrange

我试图从另一个表中的另一个字段更新表中的字段。

正在更新的表将有多个记录,需要从另一个表中的1个匹配项进行更新。

示例,我有100万行销售历史记录文件。这些百万条记录有大约40,000个不同的sku代码,每行有一个日期和时间戳。每个sku都会有多个记录。

我添加了一个名为MATCOST的新字段(材料成本)。

我有第二张包含SKU和MATCOST的表格。

所以我想用表2中相应的SKU的MATCOST标记表1中的每一行。当它不是一对一的关系时,我似乎无法实现这一点。

这就是我的尝试:

update 
  aulsprx3/cogtest2 
set 
  matcost = (select Matcost from queryfiles/coskitscog where 
  aulsprx3/cogtest2.item99 = queryfiles/coskitscog.ITEM ) 
where 
  aulsprx3/cogtest2.item99=queryfiles/coskitscog.ITEM

但是这会导致SQL错误:列限定符或表COSKITSCOG未定义并突出显示最后一个对queryfiles / coskitscog.Item的引用中的q

有什么想法吗?

最基本的问候

亚当

更新:这是我的表原则上的样子。 1表包含销售数据,另一个包含销售商品的MATCOSTS。我需要使用COSKITCOG表中的数据更新Sales Data表(COGTEST2)。我不能使用coalesce语句,因为它不是1对1关系,我使用的大多数选择函数都会导致多次选择的错误。唯一匹配的字段是Item = Item99

我找不到匹配多个的方法。在示例中,我们必须使用3个SQL语句,并只指定项目代码。但在现场我有大约40,000个物品代码和超过一百万个销售数据记录要更新。如果SQL不这样做,我想我必须尝试在RPG程序中编写它,但这暂时超出了我的范围。

感谢您提供的任何帮助。

Tables Example

4 个答案:

答案 0 :(得分:5)

好的,这是最终的SQL语句。 (实际上有3个值要更新)

    UPDATE atst2f2/SAP20 ct                                  
       SET VAL520 = (SELECT cs.MATCOST                       
                    FROM queryfiles/coskitscog cs           
                    WHERE cs.ITEM = ct.pnum20),
           VAL620 = (SELECT cs.LABCOST                       
                    FROM queryfiles/coskitscog cs           
                    WHERE cs.ITEM = ct.pnum20),
           VAL720 = (SELECT cs.OVRCOST                       
                    FROM queryfiles/coskitscog cs           
                    WHERE cs.ITEM = ct.pnum20),             
       WHERE ct.pnum20 IN (SELECT cs.ITEM                    
                       FROM queryfiles/coskitscog cs)

答案 1 :(得分:2)

使用correlation names限定列。

UPDATE AULSPRX3/COGTEST2 A
    SET A.matcost = (SELECT matcost 
                       FROM QUERYFILES/COSKITSCOG B
                       WHERE A.item99 = B.item)
    WHERE EXISTS(SELECT * 
                   FROM QUERYFILES/COSKITSCOG C
                   WHERE A.item99 = C.item)

答案 2 :(得分:2)

这种更紧凑的方式做同样的事情应该更有效率,嗯?

UPDATE atst2f2/SAP20 ct                                  
   SET (VAL520, VAL620, VAL720) = 
       (SELECT cs.MATCOST, cs.LABCOST, cs.OVRCOST                      
                FROM queryfiles/coskitscog cs           
                WHERE cs.ITEM = ct.pnum20)             
   WHERE ct.pnum20 IN (SELECT cs.ITEM                    
                   FROM queryfiles/coskitscog cs)

答案 3 :(得分:0)

UPDATE开始,我建议:

update 
  aulsprx3/cogtest2 
set 
  (matcost) = (select Matcost from queryfiles/coskitscog where 
               aulsprx3/cogtest2.item99 = queryfiles/coskitscog.ITEM)
where 
  aulsprx3/cogtest2.item99=queryfiles/coskitscog.ITEM

请注意matcost周围的大括号。