2012-10-12 143 views
5

我試圖從另一個表中的另一個字段更新表中的字段。從另一個表中的另一個字段(OS400,而不是1對1的關係)中更新1字段

正在更新的表將有多個記錄,需要從另一個表中的1個匹配更新。

例如,我有一個100萬行銷售歷史文件。這百萬條記錄大約有40,000個不同的SKU代碼,每行都有日期和時間戳。每個SKU將在那裏有多個記錄。

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

我有第二個表包含SKU和MATCOST。

所以我想在表1中的每一行與相應的SKU的MATCOST在表2中戳記。當它不是1對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的Q/coskitscog.Item

有任何想法嗎 ?

最親切的問候

亞當

更新:這是我的表像原則。 1表包含銷售數據,另一個表包含銷售商品的MATCOSTS。我需要使用COSKITCOG表中的數據更新銷售數據表(COGTEST2)。我不能使用coalesce語句,因爲它不是1對1的關係,我使用的大多數選擇函數都會導致多個選擇的錯誤。唯一匹配的字段是Item = Item99

我找不到匹配多個的方法。在這個例子中,我們將不得不使用3個SQL語句,只需指定項目代碼。但在現場,我有大約40,000個產品代碼和超過100萬個銷售數據記錄進行更新。如果SQL不會這樣做,我想我不得不嘗試在RPG程序中寫入它,但現在這種方式超過了我。

感謝您提供的任何幫助。

Tables Example

+0

其他人提供任何幫助? –

回答

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) 
+0

您可能希望在'A.matcost <> C.matcost'的最後一個子查詢中添加一個測試,因爲在更新值不會更改的記錄中沒有什麼意義。 – WarrenT

+0

感謝您的回覆@JamesA,但我得到: 結果選擇的多行,當我運行:( –

+0

(matcost SELECT FROM QUERYFILES/COSKITSCOG乙 WHERE A.item99 = B.item) where子句這裏將導致多重A = B,因爲A可能有1000次重複的項目,因爲它是由日期驅動的,這個項目可以每天銷售5年,這就是COGTEST2文件所持有的數量巨大的銷售歷史 –

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括號。

+0

嗨@Olaf Dietsche它不喜歡最初逗號,只是得到:令牌,無效。有效令牌:SET。 –

+0

爲此,我獲得了列限定符或表COSKITSCOG未定義,並突出顯示了最後一個對coskitscog.item的引用 –

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) 
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) 
相關問題