0

さて、私は2つのテーブルを持っています

次のフィールドを持つ VOUCHERT

ACTIVATIONCODE
SERIALNUMBER
VOUCHERDATADBID 
UNAVAILABLEAT   
UNAVAILABLEOPERATORDBID 
AVAILABLEAT 
AVAILABLEOPERATORDBID   
ACTIVATIONCODENEW   
EXT1    
EXT2    
EXT3    
DENOMINATION -- I added this column into the table.

2 番目のテーブルは、次のフィールドを持つ VOUCHERDATAT です。

VOUCHERDATADBID
BATCHID
VALUE
CURRENCY
VOUCHERGROUP
EXPIRYDATE
AGENT
EXT1
EXT2
EXT3

私がやりたいことは、対応する VALUE を VOUCHERDATAT からコピーし、それを VOUCHERT の DENOMINATION に入れることです。2 つの間のリンクは VOUCHERDATADBID です。どうすればいいですか?

1:1 マッピングではありません。つまり、同じ VOUCHERDATADBID を持つ 1000 の SERIALNUMBERS が存在する可能性があるということです。そして、その VOUCHERDATADBID には VOUCHERDATAT のエントリしかないため、値は 1 つです。したがって、特定の VOUCHERDATADBID に属するすべてのシリアル番号は同じ値になります。

JOINS は機能しますか? どのタイプの JOIN を使用すればよいですか? または、UPDATE テーブルが進むべき道ですか?

助けてくれてありがとう !!

4

4 に答える 4

3

あなたの問題はデザインの1つです。どの表も、最初の正規形 (1NF) でさえも、正規形ではありません。テーブルに列を追加するのではなく、次のVOUCHERT列を持つ新しいテーブルを作成 (名前を選択) する必要があります。 . 正規化とは、考えられるすべての異常を解決することを目的とするデータベース設計プロセスです。これで問題が解決するはずです。SERIALNUMBERVALUEVOUCHERDATADBIDACTIVATIONCODEVOUCHERTACTIVATIONCODEINSERTUPDATEDELETEINSERT

お役に立てれば。

于 2012-12-07T21:37:06.853 に答える
0

バウチャーデータアドビッドが主キーでない場合、これは機能するはずです。

UPDATE vouchert
   SET denomination =
       (SELECT MAX(value)
          FROM voucherdatat
         WHERE voucherdatadbid = vouchert.voucherdatadbid);
于 2012-06-03T16:52:10.877 に答える
0

これら 2 つのテーブルを結合すると、「ビュー」が得られます。このビューは次のように更新できます。

UPDATE (SELECT * 
        FROM VOUCHERT A JOIN VOUCHERDATAT B 
             ON A.VOUCHERDATADBID = B.VOUCHERDATADBID) 
SET DENOMINATION = VALUE;

必要に応じて外部結合を入れることができます。

VOUCHERDATADBID は VOUCHERDATAT の PRIMARY KEY と VOUCHERT の FOREIGN KEY である必要があります。そうしないと、エラーが発生します。

ORA-01779: cannot modify a column which maps to a non key-preserved table
于 2012-06-03T16:24:38.607 に答える
0
update  (
        select  v.DENOMINATION
        ,       vd.VALUE
        from    VOUCHERT v
        join    VOUCHERDATAT vd
        on      vd.VOUCHERDATADBID = v.VOUCHERDATADBID
        ) t
set     t.DENOMINATION = t.Value
于 2012-06-03T16:24:40.343 に答える