6

別のテーブルの別のフィールドからテーブルのフィールドを更新しようとしています。

更新中のテーブルには、他のテーブルの 1 つの一致から更新する必要がある複数のレコードがあります。

例として、100 万行の販売履歴ファイルがあります。これらの 100 万件のレコードには約 40,000 の異なる SKU コードがあり、各行には日付と時刻のスタンプがあります。各 SKU には複数のレコードがあります。

MATCOST (材料費) という新しいフィールドを追加しました。

SKU と MATCOST を含む 2 番目のテーブルがあります。

したがって、表 1 のすべての行に、表 2 の対応する SKU の MATCOST をスタンプしたいと考えています。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/coskitscog.Item への最後の参照で q を強調表示しています

何か案は ?

よろしくお願いします

アダム

更新: これは私のテーブルが原則としてどのように見えるかです。1 テーブルには販売データが含まれ、もう 1 つのテーブルには販売されたアイテムの MATCOSTS が含まれます。COSKITCOG テーブルのデータで Sales Data テーブル (COGTEST2) を更新する必要があります。1対1の関係ではないため、合体ステートメントを使用できません。使用するほとんどの選択関数は、複数選択のエラーになります。一致する唯一のフィールドは Item=Item99 です

複数を一致させる方法が見つかりません。この例では、3 つの SQL ステートメントを使用し、アイテム コードのみを指定する必要があります。しかしライブでは、約 40,000 のアイテム コードと 100 万を超える販売データ レコードを更新する必要があります。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 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 に答える
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 に答える
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 に答える