Бағандағы мәнге негізделген, бір сұраудан бірнеше жолды қайтару

Менде осы кесте бар дейік:

|Fld | Number|
 1     5
 2     2

Fld ретінде Number өрісі ретінде жазылатын таңдау жасауды қалаймын:

|Fld |
 1
 1
 1
 1
 1
 2
 2

Мұны қалай алуға болады? Мен Number негізінде уақытша кесте жасау және деректерді құру туралы ойладым, бірақ мен мұны жалғыз таңдау нұсқасы арқылы жасауға болатынын сұрадым.

PS: Мен SQL-ға жаңа

1
Мен pl/sql әзірлеуші ​​8.0.0.1480 пайдаланамын
қосылды автор Roger, көзі
Қай деректер базасы және нұсқасы?
қосылды автор Mark Byers, көзі
@Roger: Oracle арқылы CONNECT BY көмегімен мұны істей аласыз деп ойлаймын.
қосылды автор Mark Byers, көзі
Мен мұны еркін нөмірмен таңдау мүмкіндігі бар деп санамаймын, бірақ сіз оны сандардың шектеулі ауқымымен немесе сақтау рәсімімен жасай аласыз.
қосылды автор Neil, көзі
SQL қандай дәмі бұл?
қосылды автор Stu, көзі

3 жауаптар

Сандар кестесімен қосыла аласыз:

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

Сандар кестесі - тек сандардың тізімін қамтитын кесте.

 Number
 1
 2
 3
 etc...
3
қосылды
+1, оған кесте жасаудың орнына 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, көзі

Жақсы шешім емес (себебі сіз әлі де кестеңізді екі рет сұраусыз, бірақ одан жұмыс істей аласыз)

    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, көзі