2014-12-30 37 views
0

假設我有兩個表:更新一個表的外鍵

表1:

SELECT * FROM ORIGINAL_DEALER; 

    ID ENAME 

----- -------------------------- 
    1 JOHN 
    2 00000JOHN 
    3 JACK 
    4 00000JACK 
    5 MARIA 
    6 00000MARIA 

表2:

SELECT * FROM NAMES; 

ID_NUM 
------ 
1 
2 
3 
4 
5 
6 
  1. 我必須更新NAMES
  2. ORIGINAL_DEALER有重複/無效的名稱,如 00000JOHN 無效名稱前有五個零有效名稱前面加上前綴。即有效的名稱:JOHN 無效名稱:00000JOHN
  3. 現在,我不得不從 ORIGINAL_DEALER表中選擇無效名稱的ID和更新ID_NUMNAMES表 有效身份證件。即當無效ename= '00000JOHN'有一個ID = 2這也是無效的。但original_dealer是父表,我必須用有效的 個人替換NAMES表中的所有無效ID。

即更新名稱後面的輸出應該是:

SELECT * FROM NAMES; 

ID_NUM 
------ 
1 
1 
3 
3 
5 
5 

我怎麼能做到這一點無需每次手動設置它會有巨大的數據? 我正在使用Oracle DB

+2

歡迎來到Stack Overflow。這不是在這裏提出問題的好方法。 您是否嘗試過解決您的問題? 首先顯示你的努力,以便人們可以展示他們的努力。 請先閱讀[如何提問](http://stackoverflow.com/help/how-to-ask)和[幫助中心](http://stackoverflow.com/help)作爲開始。 –

+0

您可以使用內部查詢.. – Prashant

+0

列ENAME中的值是唯一的嗎?我認爲不是因爲我認爲ID是主鍵,而ENAME是數據字段。 「錯誤」和「正確」名稱是否總是被列爲記錄,其中一個值的ID不同?錯誤的名稱總是ID的一個值更高嗎? – tvCa

回答

1

通過使用內部查找子查詢,您可以使用類似於下面的查找的update語句,該子查詢繼而使用TRIM函數在匹配過程中去除前導零。我們還將更新限制爲僅與鏈接的OriginalDealer記錄,以00000開頭,以減少不必要更新的風險。

UPDATE Names SET ID_NUM = 
(SELECT od1.ID 
FROM OriginalDealer od1 
     INNER JOIN OriginalDealer od2 
     ON od1.EName = TRIM(LEADING '0' FROM od2.EName) 
WHERE od2.ID = Names.ID_NUM) 
WHERE EXISTS 
(
    SELECT 1 
    FROM OriginalDealer od 
    WHERE od.ENAME LIKE '00000%' 
    AND Names.ID_NUM = od.ID 
); 

SqlFiddle here

注意,對於像「00000」的前綴標記重複的模式是相當脆弱的:

  • 它假定有在00000NAMENAME行之間究竟1匹配ORIGINAL_DEALER
  • 如果以上內容不正確,它將嘗試將Names.ID_NUM設置爲NULL或失敗,如果有多個matc h(這可能是一件好事,我們不想破壞數據)
+1

謝謝StuartLC ..它工作得很好..非常感謝:) –