2017-04-24 25 views
0

我試圖根據另外兩個表中的數據將數值插入表中。這些數字值與表SL_TERMS中的字符串相關聯。這些字符串用於其他表UPLOAD_TEST,其中包含我想要填充的數據PC_TEST根據另一個表中的字符串插入關聯的ID

例如,如果UPLOAD_TESTSL_TERMS table中具有字符串「environment」並且其ID爲1,我想要將值1插入到PC_TEST中。下面是代碼的兩個例子至今:

INSERT INTO PC_TEST (TEST_ID, WHAT_ID, DATA_FORM) 
SELECT PC_TEST_SEQ.NEXTVAL, t.TERM_ID, e.DATA_FORM FROM SL_TERMS t, UPLOAD_TEST e 
WHERE t.TERM_ID IN 
(SELECT WHAT FROM UPLOAD_TEST e WHERE e.WHAT = t.TERM_NAME AND t.TERM_NAME = t.TERM_ID); 
--TERM_NAME is the field that has the string associated with the needed ID 

而且

INSERT INTO PC_TEST (TEST_ID, WHAT_ID, DATA_FORM) 
SELECT PC_TEST_SEQ.NEXTVAL, t.TERM_ID, e.DATA_FORM FROM SL_TERMS t 
INNER JOIN UPLOAD_TEST e 
ON e.WHAT = t.TERM_NAME AND t.TERM_NAME = t.TERM_ID; --using join keyword 

兩個給ORA-01722:無效數字錯誤。 WHAT_IDTERM_ID字段都是數字。有沒有可能的字符串沒有正確匹配?在這種情況下,我可能需要將TRIM和/或LOWER函數應用於來自UPLOAD_TEST的字符串。任何幫助/建議表示讚賞。

e.WHATt.TERM_NAME是具有一對多關係的相同字段。因此,在SL_TERMS中,值TERM_NAME = 'environment'存在一次,其相關聯的TERM_ID = 1也存在一次。它可能存在於UPLOAD_TEST的多個記錄中。

因此流程爲e.WHAT(string) - >t.TERM_NAME(string) - >t.TERM_ID(number)。

原因我等於t.TERM_NAMEt.TERM_ID是因爲我呼籲e.WHATt.TERM_NAME)時我需要相關的ID。我不知道這是否是正確的方法(看起來不像),所以如果有方法從字符串(TERM_NAME)中調用ID(TERM_ID),那就是我所需要的。

+0

你確定't.TERM_NAME = t.TERM_ID'嗎?你說'TERM_ID'是一個數字,但它聽起來不像'TERM_NAME'也是一個數字,請將所​​有三個表結構和一些示例數據添加到您的問題中,但我懷疑該子句只是需要刪除。 –

+0

讓我知道是否我的編輯不夠明確 – snl330

回答

1

我不知道這是否是正確的方法(它看起來不像它),所以如果有方法從字符串(TERM_NAME)調用ID(TERM_ID),那就是我需要的。

這不是正確的做法。您不需要從名稱字符串中調用ID;它們位於表格中的同一行,因此只要您通過其ID標識行,該ID就可用。

所以,你可以這樣做:

INSERT INTO PC_TEST (TEST_ID, WHAT_ID, DATA_FORM) 
SELECT PC_TEST_SEQ.NEXTVAL, t.TERM_ID, e.DATA_FORM 
FROM SL_TERMS t 
INNER JOIN UPLOAD_TEST e 
ON e.WHAT = t.TERM_NAME; 

你得到的錯誤,因爲當你包括t.TERM_NAME = t.TERM_ID條款甲骨文不得不嘗試轉換每個標識行的TERM_NAME的數量,以便將它與比較數字ID。除非名稱僅包含數字字符,否則會導致您看到的錯誤。在你的例子中,你隱式地試圖去to_number('environment') = 1,而隱含的to_number()將拋出ORA-01722,因爲'environment'不是一個數字。 (and it won't - 「將字符值與數字值進行比較時,Oracle將字符數據轉換爲數字值。」「),ID和名稱仍然不會相同,所以你不會得到任何數據而不是錯誤

+0

我在理解了你的評論之後嘗試了它,它工作正常_ _你不需要從名稱字符串中調用ID;它們位於表中的同一行,所以ID是隻有當你通過它的ID來識別行時纔可用__這不是我所能確定的,PLSQL不是我的主要,所以有時我不知道底層是怎麼回事。所有內幕信息。標記爲正確。 – snl330

相關問題