根据来自另一个 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_ID
和 TERM_ID
字段都是数字。字符串是否可能没有正确匹配?在这种情况下,我可能需要将 TRIM
and/or LOWER
函数应用于 UPLOAD_TEST
中的字符串。任何 help/suggestions 表示赞赏。
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_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 和名称仍然不会是相同,所以你不会得到任何数据,而是一个错误。
我正在尝试根据来自其他两个 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_ID
和 TERM_ID
字段都是数字。字符串是否可能没有正确匹配?在这种情况下,我可能需要将 TRIM
and/or LOWER
函数应用于 UPLOAD_TEST
中的字符串。任何 help/suggestions 表示赞赏。
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_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 和名称仍然不会是相同,所以你不会得到任何数据,而是一个错误。