2016-03-22 34 views
0

値(FACTテーブル)を持つ1つの列をキー/値テーブル(FACT_ATTRIBUTEテーブル)にマージしようとしているテーブルが2つあります。キーは数値で、値はvarchar2です。 FACT_ATTRIBUTEテーブルにはすでにいくつかのエントリがあります。私は、新しいエントリにマージするパッケージプロシージャを記述しようとしています。私たちはトリガーとシーケンスを取り除こうとしています。私はテーブルにないエントリを選択するSQLを少し持っていますが、インデックスキー値を作成する方法には苦労しています。キーは、現在の最大値より1だけ大きいはずです。Oracle、マージテーブル、IDを増やしながら欠損値を挿入

たとえば、FACT_ATTRIBUTEテーブルにはすでにキー5までのエントリがあります。新しいエントリ「値6」が入ります。キー/値の挿入はFACT_ATTRIBUTEの(6、 "値6")になります。ここで

私が午前ところです:問題は明らかである

INSERT INTO FACT_ATTRIBUTE (
     KEY, VALUE 
    ) 
    VALUES(
    (SELECT (MAX(KEY) + 1) FROM FACT_ATTRIBUTE), 
    (SELECT DISTINCT ENTRY 
    FROM FACT fact_table 
    WHERE NOT EXISTS ( 
     SELECT 1 FROM FACT_ATTRIBUTE fa 
     WHERE fa.VALUE = fact_table.ENTRY 
    )) 
    ); 

インサートが単一の値である一方で、選択の内側には、複数の要素をつかみます。 1つの制約は、新しい値がない場合、nullでクラッシュできないことです。これを達成する良い方法はありますか?私のSQLスキルは最強ではありません。助けをあらかじめありがとう!

+0

、クエリが逆転しそうです、それはあなたが値に数値を入力しているように思える、とキーに文字列を、あなたの説明では、あなたがテーブルに周り(数値、他の方法を説明してきたのに対し、キーの場合は文字列、値の場合は文字列)。 これは目的に合っているのですか、またはクエリに間違いがありますか? –

+0

ありがとう、それらを元に戻しましたが、依然としてクエリが機能しません –

+0

このコメントはあなたの問題を解決するためのものではなく、データの構造を理解することです。私はあなたの質問への答えとして解決策を掲示しました。それがあなたを助けるかどうかを見てください。がんばろう。 –

答えて

0

これは私が必要としたものに私をもたらした最終的な解決策です。手始めに

DECLARE 
max_id NUMBER; 
BEGIN 

--If no value, start with 1 
SELECT NVL(max(fa.FACT_ATTRIBUTE), 1) 
INTO max_id 
FROM FACT_ATTRIBUTE fa; 

INSERT INTO FACT_ATTRIBUTE (KEY, VALUE) 
SELECT max_id + ROWNUM, DATA 
FROM (
    SELECT DISTINCT f.DATA 
    FROM FACT f 
    WHERE NOT EXISTS (
     SELECT 1 
     FROM FACT_ATTRIBUTE fa 
     WHERE fa.VALUE = f.DATA 
    ) 
    AND f.DATA IS NOT NULL 
); 

END; 
0

問題を解決する方法として、挿入ステートメントを値から選択して変換する方法があります。これを試してみてください -

INSERT INTO FACT_ATTRIBUTE (
     KEY, VALUE 
    ) 
    SELECT max(key) over (partition by value) + 1 as key_max, f.entry 
    FROM (
      SELECT f.entry, fa.value 
      FROM fact_table f 
      LEFT OUTER JOIN fact_attribute fa 
      ON f.entry = fa.value) 
    WHERE fa.value is null; 

それは私がこれを上のチェックするサーバーを持っていませんが、要点は右の私には思える少し構文ポリッシュ原因を必要とするかもしれません - 左の外側を使用してエントリをすべてません照会する参加現在の最大値をFACT_ATTRIBUTEに追加してテーブル+ 1に追加します。

関連する問題