列の値に基づいて、単一の問合せから複数の行を戻す

私はこのテーブルを持っているとしましょう:

|Fld | Number|
 1     5
 2     2

そして、 Number フィールドと同じ数の Fld を検索するselectを作成したいとします。

|Fld |
 1
 1
 1
 1
 1
 2
 2

どうすればこれを達成できますか?一時的なテーブルを作成し、 Number に基づいてデータを作成することを考えていましたが、これを単一のSelect文で行うことができるのだろうかと思いました。

PS:私はSQLに新しい

1
私はpl/sqlの開発者8.0.0.1480を使用しています
追加された 著者 Roger,
どのデータベースとバージョン?
追加された 著者 Mark Byers,
@Roger:Oracleでは、CONNECT BYを使用してこれを行うことができると思います。
追加された 著者 Mark Byers,
私はあなたが任意の数字を持つ単一のSelectステートメントでそれを行うことはできないと思いますが、限られた範囲の数値またはストアドプロシージャで実行できます。
追加された 著者 Neil,
これはSQLの味ですか?
追加された 著者 Stu,

3 答え

あなたは数値表に参加することができます:

SELECT Fld
FROM yourtable
JOIN Numbers
ON yourtable.Number <= Numbers.Number

数字表は数字のリストを持つ単なる表です:

 Number
 1
 2
 3
 etc...
3
追加された
+1は、CTEがテーブルを作成するのではなく、CTEにとって良いタイミングです。
追加された 著者 Abe Miessler,

あなたのRDBMSのバージョンがそれをサポートしているかどうかはわかりませんが(私はむしろそうは思われます)、ここでは再帰的なバージョンがあります:

WITH remaining (fld, times) as (SELECT fld, 1
                                FROM <table>
                                UNION ALL
                                SELECT a.fld, a.times + 1
                                FROM remaining as a
                                JOIN <table> as b
                                ON b.fld = a.fld
                                AND b.number > a.times)

SELECT fld
FROM remaining
ORDER BY fld

Given your source data table, it outputs this (count included for verification):

fld    times
=============
1      1 
1      2 
1      3 
1      4 
1      5 
2      1 
2      2                     
2
追加された
@Roger - SQLの特定のタイプの分析では、再帰的なクエリが重要です。それらを学ぶ。彼らはあらゆる種類の楽しいことをするのに使うことができます。
追加された 著者 Clockwork-Muse,

素晴らしい解決策ではありません(あなたはまだテーブルを2回クエリしていますが、おそらくそれから作業することができます)

    SELECT t1.fld, t1.number
    FROM table t1, (
        SELECT ROWNUM number FROM dual 
        CONNECT BY LEVEL <= (SELECT MAX(number) FROM t1)) t2
    WHERE t2.number<=t1.number

必要な最大量の行を生成し、それを各行でフィルタリングします。

2
追加された
完璧!どうもありがとうございました。
追加された 著者 Roger,