2012-06-03 142 views
0

好吧,我有两个表在SQL中如何基于另一个字段的值将值从一个表复制到另一个表?

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购买并放入VOUCHERT的DENOMINATION。两者之间的链接是VOUCHERDATADBID。我该如何解决它?

它不是1:1映射。我的意思是可能有1000个SERIALNUMBERS与VOUCHERDATADBID相同。而且VOUCHERDATADBID只能在VOUCHERDATAT中输入,因此只有一个值。因此,属于某个VOUCHERDATADBID的所有序列号将具有相同的值。

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

感谢您的帮助!

回答

3

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

希望这会有所帮助。

0

您可以在这两个表格之间进行连接,您将看到'视图'。您可以更新此视图,如:

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

如果需要,您可以将外连接。

VOUCHERDATADBID必须在VOUCHERDATAT和VOUCHERT外键主键,否则你会得到一个错误:如果voucherdatadbid是不是主键

ORA-01779: cannot modify a column which maps to a non key-preserved table 
+0

我试着运行你以前的查询,它超时了两次。第一次让它运行6小时,第二次运行3小时。将尝试这个版本,并回到你身边。谢谢 ! – Joshua1729

+0

所以你的问题是表格太大!?每张桌子有多少行? –

+0

Vouchert有264,582,461行, 凭证数据有994行。 我想这是问题所在。没有足够的内存我猜 – Joshua1729

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

不应该加入... ON?而不是在哪里?如果你使用的地方,然后用逗号代替JOIN,你会得到旧式的连接。 –

+0

@CosminVacaroiu:是的,应该是'on'而不是'where',在答案中编辑。 – Andomar

+0

我收到以下错误消息。是“有效”吗?我已经逐行复制了代码。谢谢 ORA-00971:缺少SET关键字 – Joshua1729

0

,这应该工作:

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

我认为你的意思是“从voucherdatat”对吧? - 谢谢你会试试看,并回复给你。 – Joshua1729

+0

是的,你是对的。 – DCookie

+0

如果你更新了2.64亿行,准备好需要一段时间。 – DCookie

相关问题