2017-04-24 5 views
0

他の2つのテーブルのデータに基づいて数値をテーブルに挿入しようとしています。これらの数値はテーブルSL_TERMSの文字列に関連付けられています。これらの文字列は、他のテーブルUPLOAD_TESTに使用されています。このテーブルには、データを入れたいPC_TESTがあります。別のテーブルの文字列に基づいて関連IDを挿入

たとえば、UPLOAD_TESTに文字列 "environment"があり、そのIDがSL_TERMS tableに1の場合、PC_TESTに値1を挿入します。無効な番号エラー:

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を与える:ここでは、これまでのコードの2つの例を示します。 WHAT_IDフィールドとTERM_IDフィールドは両方とも数値です。文字列が正しく一致しない可能性はありますか?その場合はUPLOAD_TESTの文字列にTRIMおよび/またはLOWERの関数を適用する必要があります。どんな助言/提案も感謝しています。

e.WHATt.TERM_NAMEは、1対多の関係を持つ同じフィールドです。したがって、SL_TERMSでは、値TERM_NAME = 'environment'が1度存在し、それに対応するTERM_ID = 1も存在します。 UPLOAD_TESTの複数のレコードに存在する可能性があります。

したがって、フローはe.WHAT(文字列) - >t.TERM_NAME(文字列) - >t.TERM_ID(数値)です。

私がe.WHATt.TERM_NAME)と呼ぶとき、私は関連IDが必要なので、私がt.TERM_NAMEからt.TERM_IDに等しい理由はです。私はこれが正しい方法であるかどうかは分かりませんでした(それはそうではないようです)ので、ID(TERM_ID)を文字列(TERM_NAME)から呼び出す方法があれば、それが必要です。

+0

' t.TERM_NAME = t.TERM_ID'について確信していますか?あなたは 'TERM_ID'数値ですが、 'TERM_NAME'のように聞こえません。3つのテーブル構造とサンプルデータをすべてあなたの質問に追加してください。ただし、その句は削除する必要があります。 –

+0

私に知らせてください – snl330

答えて

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; 

とそれを比較するために、すべての識別される行のTERM_NAME数に変換しようとすること、あなたがt.TERM_NAME = t.TERM_ID句オラクルが含まれている場合にされているため、あなたがエラーを取得しています数値ID。名前が数字だけで構成されている場合を除き、エラーが表示されます。あなたの例では、暗黙的にto_number('environment') = 1にしようとしています。暗黙的にto_number()はORA-01722を投げます。なぜなら、 '環境'は数字ではないからです。

おそらくオラクルは数値を文字列に変換することを選択できましたが、それを行ったとしても(and it won't - "文字値と数値を比較すると、Oracleは文字データを数値に変換します。")、IDと名前は同じではないので、エラーではなくデータを取得するでしょう。

+0

私はあなたのコメントを理解した直後にそれを試してみました。名前の文字列からIDを呼び出す必要はありません;それらはテーブルの同じ行にあり、IDはPLSQLは私のメインではないので時々私はボンネットの下で何が起こっているのか分からない。正しい答えをお寄せいただきありがとうございます。すべての下着情報。正しいとマークされています。 – snl330

関連する問題