10

オラクルを使用して、ショッピング アプリから明細項目を出力しています。各アイテムには、1 より大きい数量フィールドがあり、1 より大きい場合は、その行を N 回返したいと思います。

これが私がテーブルについて話していることです

product_id, quanity
1, 3,
2, 5

そして、私は返すクエリを探しています

1,3
1,3
1,3
2,5
2,5
2,5
2,5
2,5

これは可能ですか?SQL Server 2005 のこの回答を見ました。Oracle でほぼ正確なものを探しています。残念ながら、専用の数値テーブルを作成することはできません。

4

2 に答える 2

15

この例では最大値として 15 を使用しましたが、9999 またはサポートする最大数に設定する必要があります。

create table t (product_id number, quantity number);
insert into t values (1,3);
insert into t values (2,5);

select t.* 
  from t 
    join (select rownum rn from dual connect by level < 15) a 
                                 on a.rn <= t.quantity
order by 1;
于 2010-09-08T05:59:09.907 に答える
4

最初にサンプル データを作成します。

create table my_table (product_id number , quantity number);
insert into my_table(product_id, quantity) values(1,3);
insert into my_table(product_id, quantity) values(2,5);

そして、次の SQL を実行します。

  SELECT product_id, quantity
    FROM my_table tproducts
        ,(    SELECT LEVEL AS lvl
                FROM dual
          CONNECT BY LEVEL <=  (SELECT MAX(quantity) FROM my_table)) tbl_sub
   WHERE tbl_sub.lvl BETWEEN 1 AND tproducts.quantity
ORDER BY product_id, lvl;

PRODUCT_ID   QUANTITY
---------- ----------
         1          3
         1          3
         1          3
         2          5
         2          5
         2          5
         2          5
         2          5

この質問はおそらくこれと同じです:オラクルで範囲を計算する方法

Oracle 9i の更新ソリューション:

次のように pipelined_function() を使用できます。

CREATE TYPE SampleType AS OBJECT
(
  product_id number,
  quantity varchar2(2000)
)
/

CREATE TYPE SampleTypeSet AS TABLE OF SampleType
/

CREATE OR REPLACE FUNCTION GET_DATA RETURN SampleTypeSet
PIPELINED
IS
    l_one_row SampleType := SampleType(NULL, NULL);

BEGIN

    FOR cur_data IN (SELECT product_id, quantity FROM my_table ORDER BY product_id) LOOP
        FOR i IN 1..cur_data.quantity LOOP
            l_one_row.product_id := cur_data.product_id;
            l_one_row.quantity := cur_data.quantity;
            PIPE ROW(l_one_row);
        END LOOP;
    END LOOP;

    RETURN;
END GET_DATA;
/

今、あなたはこれを行うことができます:

SELECT * FROM TABLE(GET_DATA());

またはこれ:

CREATE OR REPLACE VIEW VIEW_ALL_DATA AS SELECT * FROM TABLE(GET_DATA());
SELECT * FROM VIEW_ALL_DATA;

どちらも同じ結果です。

(私の記事のパイプライン関数に基づく)

于 2010-09-08T08:33:46.317 に答える