Retourneren van meerdere rijen uit een enkele query, op basis van de waarde van een kolom

Laten we zeggen dat ik deze tabel heb:

|Fld | Number|
 1     5
 2     2

En ik wil een selectie maken die zoveel Fld ophaalt als het veld Number heeft:

|Fld |
 1
 1
 1
 1
 1
 2
 2

Hoe kan ik dit bereiken? Ik zat te denken aan het maken van een tijdelijke tabel en instert gegevens op basis van het nummer , maar ik vroeg me af of dit kon worden gedaan met een enkele Select-instructie.

PS: Ik ben onbekend met SQL

1
Ik gebruik pl/sql-ontwikkelaar 8.0.0.1480
toegevoegd de auteur Roger, de bron
Welke database en versie?
toegevoegd de auteur Mark Byers, de bron
@Roger: met Oracle denk ik dat je dit kunt doen door CONNECT BY te gebruiken.
toegevoegd de auteur Mark Byers, de bron
Ik denk niet dat je het kunt doen met een enkele Select-instructie met een willekeurig getal, maar je kunt het doen met een beperkt aantal nummers of met een opgeslagen procedure.
toegevoegd de auteur Neil, de bron
Welke smaak van SQL is dit?
toegevoegd de auteur Stu, de bron

3 antwoord

U kunt lid worden van een getallentabel:

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

Een getallentabel is slechts een tabel met een lijst met nummers:

 Number
 1
 2
 3
 etc...
3
toegevoegd
+1, is misschien een goed moment voor een CTE in plaats van er een tabel voor te maken.
toegevoegd de auteur Abe Miessler, de bron

Ik weet niet of uw RDBMS-versie dit ondersteunt (hoewel ik vermoed dat dit het geval is), maar hier is een recursieve versie:

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
toegevoegd
@Roger - Voor bepaalde typen analyses in SQL zijn recursieve query's de koning. Leer ze. Ze kunnen worden gebruikt om allerlei leuke dingen te doen.
toegevoegd de auteur Clockwork-Muse, de bron

Geen geweldige oplossing (aangezien je je tabel nog twee keer opzoekt, maar misschien kan je er ook vanaf werken)

    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

Het genereert het maximale aantal benodigde rijen en filtert het vervolgens per rij.

2
toegevoegd
Perfect! dank u zeer.
toegevoegd de auteur Roger, de bron