根据来自另一个 table 的字符串插入关联 ID

Insert associated IDs based on string from another table

我正在尝试根据来自其他两个 table 的数据将数值插入到 table 中。这些数值与 table SL_TERMS 中的字符串相关联。这些字符串用于另一个 table、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: invalid number 错误。 WHAT_IDTERM_ID 字段都是数字。字符串是否可能没有正确匹配?在这种情况下,我可能需要将 TRIM and/or LOWER 函数应用于 UPLOAD_TEST 中的字符串。任何 help/suggestions 表示赞赏。

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.WHAT (t.TERM_NAME) 时需要关联的 ID。我不知道这是否是正确的做法(看起来不像),所以如果有办法从字符串 (TERM_NAME) 中调用 ID (TERM_ID) ,这就是我需要的。

I didn't know if this is the correct way to do it (it doesn't seem like it), so if there's a way to call the ID (TERM_ID) from the string (TERM_NAME), that's what I need.

这不是正确的方法。您不需要从名称字符串中调用 ID;它们在 table 中的同一行中,因此只有在您通过 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,因为 'environment' 不是数字。

可以说 Oracle 可以选择将数字转换为字符串,但即使它这样做了 (and it won't - "When comparing a character value with a numeric value, Oracle converts the character data to a numeric value."),ID 和名称仍然不会是相同,所以你不会得到任何数据,而是一个错误。