在SQL中如何根据另一个字段的值将值从一个表复制到另一个表?

时间:2012-06-03 16:17:44

标签: sql oracle oracle11g oracle-sqldeveloper

好的,我有两张桌子

VOUCHERT,包含以下字段

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

,第二个表是带有以下字段的VOUCHERDATAT

VOUCHERDATADBID
BATCHID
VALUE
CURRENCY
VOUCHERGROUP
EXPIRYDATE
AGENT
EXT1
EXT2
EXT3

我想要做的是从VOUCHERDATAT复制相应的VALUE并将其放入VOUCHERT的DENOMINATION中。两者之间的联系是VOUCHERDATADBID。我该怎么做呢?

这不是1:1的映射。我的意思是可能有1000个SERIALNUMBERS具有相同的VOUCHERDATADBID。并且VOUCHERDATADBID只有VOUCHERDATAT中的条目,因此有一个值。因此,属于某个VOUCHERDATADBID的所有序列号都具有相同的值。

JOINS会工作吗?我应该使用什么类型的JOIN?或者UPDATE表是要走的路?

感谢您的帮助!!

4 个答案:

答案 0 :(得分:3)

你的问题是设计之一。您的表格都不是任何正常形式,即使是第一范式(1NF)也没有。您不应该向VOUCHERT表添加列,而是使用以下列创建新表(选择名称):SERIALNUMBERVALUEVOUCHERDATADBID(也许{ {1}} - 需要知道ACTIVATIONCODE上的主键,以确定新表中是否应包含VOUCHERT。规范化是数据库设计过程,旨在解决任何可能的ACTIVATIONCODE / INSERT / UPDATE异常。这应解决您的DELETE问题。

希望这有帮助。

答案 1 :(得分:0)

您可以在这两个表之间进行联接,您将获得一个“查看”视图。您可以更新此视图,如:

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

答案 2 :(得分:0)

update  (
        select  v.DENOMINATION
        ,       vd.VALUE
        from    VOUCHERT v
        join    VOUCHERDATAT vd
        on      vd.VOUCHERDATADBID = v.VOUCHERDATADBID
        ) t
set     t.DENOMINATION = t.Value

答案 3 :(得分:0)

如果voucherdatadbid不是主键,则应该有效:

UPDATE vouchert
   SET denomination =
       (SELECT MAX(value)
          FROM voucherdatat
         WHERE voucherdatadbid = vouchert.voucherdatadbid);