6

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

正在更新的表将有多个记录需要从另一个表中的 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 错误:Column qualifier or table COSKITSCOG undefined and highlight the q in last reference to queryfiles/coskitscog.Item

有任何想法吗 ?

最亲切的问候

亚当

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

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

感谢您的任何帮助,您可以提供。

表格示例

4

4 回答 4

6

好的,这是最后一个有效的 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)
于 2012-10-24T10:00:00.257 回答
3

使用相关名称限定列。

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)
于 2012-10-12T16:06:59.157 回答
3

这种更紧凑的方式来做同样的事情应该更有效,是吗?

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)
于 2013-03-19T02:05:47.967 回答
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

于 2012-10-12T16:40:00.297 回答