我正在尝试根据来自其他两个表的数据将数值插入表中。这些数值与表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_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_NAME
等同于t.TERM_ID
的原因是因为我在调用e.WHAT
(t.TERM_NAME
)时需要相关的ID。我不知道这是否是正确的方法(它看起来不像),所以如果有办法从字符串(TERM_ID
)调用ID(TERM_NAME
) ,这就是我需要的。
答案 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和名称仍然不一样,所以你没有数据而不是错误。