4

INSERT/SELECT コンボを使用して、他のテーブルからデータを挿入しようとしています。また、特定の計算でインクリメントを挿入する必要があります。ただし、なぜ機能しないのかわかりません。

次のようなテーブル (temp_business_area) があります。

 ----------
 | bname  |
 ----------
 | London |
 | Sydney |
 | Kiev   |
 ----------

これを列挙テーブルに入れたい:

 -----------------------------------------------------------------
 | identifier    | language_id |   code | data   | company_limit |
 ----------------------------------------------------------------|
 | BUSINESS_UNIT |    0        |   100  | London | 126           |
 | BUSINESS_UNIT |    0        |   200  | Sydney | 126           |
 | BUSINESS_UNIT |    0        |   300  | Kiev   | 126           |
 -----------------------------------------------------------------

しかし、私が得るのはこれです:

-----------------------------------------------------------------
 | identifier    | language_id |   code | data   | company_limit |
 ----------------------------------------------------------------|
 | BUSINESS_UNIT |    0        |   100  | London | 126           |
 | BUSINESS_UNIT |    0        |   100  | Sydney | 126           |
 | BUSINESS_UNIT |    0        |   100  | Kiev   | 126           |
 | BUSINESS_UNIT |    0        |   200  | London | 126           |
 | BUSINESS_UNIT |    0        |   200  | Sydney | 126           |
 | BUSINESS_UNIT |    0        |   200  | Kiev   | 126           |
 | BUSINESS_UNIT |    0        |   300  | London | 126           |
 | BUSINESS_UNIT |    0        |   300  | Sydney | 126           |
 | BUSINESS_UNIT |    0        |   300  | Kiev   | 126           |
 -----------------------------------------------------------------

そして、これが私のループです。

BEGIN 
    FOR x IN 1 .. 3 LOOP
         INSERT INTO enum (identifier, language_id, code, data, company_limit)
         SELECT 'BUSINESS_UNIT', 0, x*100, bname, 126 FROM temp_business_area;
    END LOOP;
END;

どこを間違えているのかわかりません。ヘルプ?

4

2 に答える 2

13

の各行に対して 3 つの挿入を行っているためtemp_business_area、9 行になります。

達成したいことの説明から、ループはまったく必要ありません。

単一の挿入を使用するだけです:

INSERT INTO enum (identifier, language_id, code, data, company_limit)
SELECT 'BUSINESS_UNIT', 
        0,  
        row_number() over (order by null) * 100, 
        bname, 126 
FROM temp_business_area;

SELECT ステートメントは 3 行を返し、各行がenumテーブルに挿入されます。このrow_number()関数は、各行 (1,2,3) の増分値を返し、これを 100 倍すると、必要なコードが得られます。

編集
(Davidのコメントの後):

ウィンドウ関数を使用すると、ステートメントに多少のオーバーヘッドが追加されます。番号付けを追加で制御する必要がない場合は、ROWNUM代わりに を使用すると少し効率的になります (ただし、3 行だけでは問題になりません)。

INSERT INTO enum (identifier, language_id, code, data, company_limit)
SELECT 'BUSINESS_UNIT', 
        0,  
        rownum * 100, 
        bname, 126 
FROM temp_business_area;
于 2012-12-18T13:43:16.030 に答える
8

他に 2 つのバリアントを使用できます。

declare

i integer := 1;

BEGIN 

    FOR x IN (select distinct bname from temp_business_area) LOOP

         INSERT INTO enum (identifier, language_id, code, data, company_limit)
         SELECT 'BUSINESS_UNIT', 0, i*100, x.bname, 126 FROM temp_business_area;

         i := i + 1;

    END LOOP;
END;

バリアント 2

BEGIN 

        FOR x IN 1..3 LOOP

             INSERT INTO enum (identifier, language_id, code, data, company_limit)
             SELECT distinct 'BUSINESS_UNIT', 0, x*100, bname, 126 FROM temp_business_area WHERE rownum = x;


        END LOOP;
    END;
于 2012-12-19T09:53:00.700 に答える