0

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

例如,如果UPLOAD_TEST有字符串“environment”并且它的 ID 是 1 SL_TERMS table,我想将值 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: invalid number错误。和WHAT_ID字段TERM_ID都是数字。字符串是否可能没有正确匹配?TRIM在这种情况下,我可能需要对LOWER来自UPLOAD_TEST. 任何帮助/建议表示赞赏。

e.WHAT并且t.TERM_NAME是具有一对多关系的相同字段。因此,在 中SL_TERMS,该值TERM_NAME = 'environment'存在一次,其关联的 也是如此TERM_ID = 1。它可能存在于UPLOAD_TEST.

因此,流程是e.WHAT(字符串)--> t.TERM_NAME(字符串)--> t.TERM_ID(数字)。

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

4

1 回答 1

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子句时,Oracle 必须尝试将每个已识别的行转换TERM_NAME为数字,以便将其与数字 ID 进行比较。除非名称仅包含数字字符,否则将导致您看到的错误。在您的示例中,您隐式尝试 to to_number('environment') = 1,并且该隐式to_number()将抛出 ORA-01722 因为“环境”不是数字。

可以说,Oracle 可以选择将数字转换为字符串,但即使它确实这样做了(而且它不会- “当将字符值与数值进行比较时,Oracle 将字符数据转换为数值。”) ,ID 和名称仍然不会相同,因此您不会得到任何数据而不是错误。

于 2017-04-24T17:58:36.567 回答