0

好的,我有两张桌子

带有以下字段的凭证

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 个序列号具有相同的 VOUCHERDATADBID。并且 VOUCHERDATADBID 在 VOUCHERDATAT 中只有一个条目,因此只有一个值。因此,属于某个 VOUCHERDATADBID 的所有序列号将具有相同的值。

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

谢谢您的帮助 !!

4

4 回答 4

3

您的问题是设计问题之一。您的所有表格都不是任何范式,甚至不是第一个范式(1NF)。您不应该向VOUCHERT表中添加列,而是使用以下列创建一个新表(选择名称):SERIALNUMBER, VALUE, VOUCHERDATADBID(也许ACTIVATIONCODE也需要知道主键VOUCHERT以确保是否ACTIVATIONCODE应该包含在新表中) . 规范化是旨在解决任何可能的 // 异常的数据库INSERT设计过程UPDATEDELETE这应该可以解决您的INSERT问题。

希望这可以帮助。

于 2012-12-07T21:37:06.853 回答
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
于 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 回答
0

如果凭证datadbid 不是主键,这应该有效:

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