好的,我有两张桌子
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表是要走的路?
感谢您的帮助!!
答案 0 :(得分:3)
你的问题是设计之一。您的表格都不是任何正常形式,即使是第一范式(1NF)也没有。您不应该向VOUCHERT
表添加列,而是使用以下列创建新表(选择名称):SERIALNUMBER
,VALUE
,VOUCHERDATADBID
(也许{ {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);