2016-06-16 10 views
0

おそらく奇妙な質問がありますが、回避策を講じる前に尋ねると思います。私はこの中で、しかし、私は項目ごとに1つの行を返すために必要な、すべてのデータを返すクエリを構築していOracle Database内の表の行の数値を行に乗算する問合せ

NAME__|__SIZE______| QTY__ 
ITEM1 | LARGE  | 30 
ITEM2 | MEDIUM  | 1 
ITEM3 | SMALL  | 1 
ITEM4 | EXTRA SMALL| 1 
ITEM5 | 116  | 1 

:私はそうのようなその量を含む「製品」のデータを含むデータベース内のテーブルを持っています私のクエリは、34行のデータを返す必要があります。そのうち30行はサイズが大きくなります。

目的のクエリは返す必要があります:

NAME__|__SIZE______| 
ITEM1 | LARGE  | 
ITEM1 | LARGE  | 
ITEM1 | LARGE  | 
ITEM1 | LARGE  | 
...total 30 times... 

ITEM2 | MEDIUM  | 
ITEM3 | SMALL  | 
ITEM4 | EXTRA SMALL| 
ITEM5 | 116  | 

これは可能ですか?

答えて

1

Oracleのセットアップ

CREATE TABLE products (NAME, SZ, QTY) AS 
SELECT 'ITEM1', 'LARGE',  10 FROM DUAL UNION ALL 
SELECT 'ITEM2', 'MEDIUM',  1 FROM DUAL UNION ALL 
SELECT 'ITEM3', 'SMALL',  2 FROM DUAL UNION ALL 
SELECT 'ITEM4', 'EXTRA SMALL', 1 FROM DUAL UNION ALL 
SELECT 'ITEM5', '116',   1 FROM DUAL; 

クエリ1 - 階層問合せを使用し

SELECT p.* 
FROM products p, 
     TABLE(CAST(MULTISET (SELECT 1 FROM DUAL CONNECT BY LEVEL <= p.qty) 
        AS SYS.ODCINUMBERLIST)); 

クエリ2 - 再帰サブクエリのファクタリング句を使用してください:出力

WITH rsqfc (name, sz, qty, n) AS (
    SELECT p.*, qty FROM products p 
UNION ALL 
    SELECT name, sz, qty, n-1 FROM rsqfc WHERE n > 1 
) 
SELECT name, sz, qty 
FROM rsqfc 
ORDER BY NAME; 

NAME SZ     QTY 
----- ----------- ---------- 
ITEM1 LARGE    10 
ITEM1 LARGE    10 
ITEM1 LARGE    10 
ITEM1 LARGE    10 
ITEM1 LARGE    10 
ITEM1 LARGE    10 
ITEM1 LARGE    10 
ITEM1 LARGE    10 
ITEM1 LARGE    10 
ITEM1 LARGE    10 
ITEM2 MEDIUM    1 
ITEM3 SMALL    2 
ITEM3 SMALL    2 
ITEM4 EXTRA SMALL   1 
ITEM5 116     1 
+0

両方の答えは正解でしたが、私の初期のクエリは私が言ったように簡単ではなかったので、私の場合は実装が簡単だった余分なクエリを提供しました。私はあなたの答えを正しいものとしてマークしています。そしてありがとう! –

1

CTEを使用できると思います。 (Postgresqlの上で実行する例)これらの線に沿って何か:

CREATE TABLE product(name text, size text, qty int); 
insert into product values('ITEM1', 'LARGE', 5); 
insert into product values('ITEM2', 'MEDIUM', 2); 

WITH RECURSIVE temp(rn, name, size, qty) AS (
    SELECT 1, name, size, qty 
     FROM product 
    UNION ALL 
    SELECT rn + 1, name, size, qty 
     FROM temp 
     WHERE rn < qty 
) 
SELECT name, size 
    FROM temp 
    ORDER BY name, size 

そして出力:

name size 
---- ---- 
ITEM1 LARGE 
ITEM1 LARGE 
ITEM1 LARGE 
ITEM1 LARGE 
ITEM1 LARGE 
ITEM2 MEDIUM 
ITEM2 MEDIUM 
+0

は、あなたの答えをありがとう、それが正解だっただけでなく、他の回答私の場合は2つのテーブルを呼び出し、他の答えの#1はすぐに働いていました彼の箱。再度、感謝します! –