Bir sütunun değerine bağlı olarak tek bir sorgudan birkaç satır döndürme

Diyelim ki şu tabloyu aldım:

|Fld | Number|
 1     5
 2     2

Ve Number alanında aşağıdaki gibi çok sayıda Fld alan bir seçim yapmak istiyorum:

|Fld |
 1
 1
 1
 1
 1
 2
 2

Bunu nasıl başarabilirim? Number temelli geçici bir tablo ve instert verileri yapmayı düşünüyordum, ancak bunun tek bir Select deyimi ile yapılıp yapılamayacağını merak ediyordum.

PS: SQL için yeni

1
Pl/sql geliştirici 8.0.0.1480 kullanıyorum
katma yazar Roger, kaynak
Hangi veritabanı ve sürümü?
katma yazar Mark Byers, kaynak
@Roger: Oracle ile CONNECT BY kullanarak bunu yapabileceğinizi düşünüyorum.
katma yazar Mark Byers, kaynak
Bunu keyfi bir sayıya sahip tek bir Select deyimi ile yapabileceğinizi sanmıyorum, ancak bunu sınırlı sayıda aralıklarla veya saklı yordamlarla yapabilirsiniz.
katma yazar Neil, kaynak
Bu SQL'in ne lezzetidir?
katma yazar Stu, kaynak

3 cevap

Sayı tablosuyla katılabilirsiniz:

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

Sayı tablosu, bir sayı listesi içeren bir tablodur:

 Number
 1
 2
 3
 etc...
3
katma
+1, bunun için bir tablo oluşturmak yerine CTE için iyi bir zaman olabilir.
katma yazar Abe Miessler, kaynak

RDBMS sürümünüzün destekleyip desteklemediğini bilmiyorum (ancak bunu yapmaktan şüphelenmeme rağmen), ancak burada tekrarlanan bir sürüm var:

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
katma
@Roger - SQL'de belirli analitik türler için, özyinelemeli sorgular kraldır. Onları öğren. Her türlü eğlenceli şeyleri yapmak için kullanılabilirler.
katma yazar Clockwork-Muse, kaynak

Harika bir çözüm değil (tablonuzu hala iki kez sorguladığınızdan, belki de bundan çalışabilirsiniz)

    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

Gerekli olan azami satır miktarını üretir ve ardından her satırda filtreler.

2
katma
Mükemmel! çok teşekkür ederim.
katma yazar Roger, kaynak