2012-06-03 189 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

相關問題