根据另一个表中的字符串插入关联的ID

时间:2017-04-24 17:11:52

标签: sql oracle sql-insert ora-01722

我正在尝试根据来自其他两个表的数据将数值插入表中。这些数值与表SL_TERMS中的字符串相关联。这些字符串在另一个表UPLOAD_TEST中使用,其中包含我要填充PC_TEST的数据。

例如,如果UPLOAD_TEST的字符串为“environment”且其SL_TERMS table中的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(字符串) - > t.TERM_NAME(字符串) - > t.TERM_ID(数字)。

我将t.TERM_NAME等同于t.TERM_ID的原因是因为我在调用e.WHATt.TERM_NAME)时需要相关的ID。我不知道这是否是正确的方法(它看起来不像),所以如果有办法从字符串(TERM_ID)调用ID(TERM_NAME) ,这就是我需要的。

1 个答案:

答案 0 :(得分:1)

  

我不知道这是否是正确的方法(它看起来不像),所以如果有方法从字符串中调用ID(TERM_ID)( TERM_NAME),这就是我的需要。

这不是正确的方法。您不需要从名称字符串中调用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子句时,Oracle必须尝试将每个已识别的行TERM_NAME转换为数字,以便将其与数字ID。除非名称仅由数字字符组成,否则将导致您看到的错误。在您的示例中,您隐式尝试to_number('environment') = 1,隐式to_number()会抛出ORA-01722,因为'环境'不是数字。

可以说Oracle本来可以选择将数字转换为字符串,但即使它确实这样做了(and it won't - "当将字符值与数值进行比较时,Oracle会将字符数据转换为一个数值。"),ID和名称仍然不一样,所以你没有数据而不是错误。