Corrélativement ligne de génération de requête dans Oracle
-
15-10-2019 - |
Question
Compte tenu de ce CTE à partir:
WITH Sections AS (
SELECT 1 Section, 1 StartUnit, 5 EndUnit FROM DUAL
UNION ALL SELECT 2, 0, 2 FROM DUAL
UNION ALL SELECT 3, 1, 1 FROM DUAL
),
Comment puis-je générer un jeu de résultats qui a autant de lignes par ligne dans la section comme il y a des numéros entre StartUnit et EndUnit (y compris), avec des valeurs croissant?
C'est, je voudrais voir un jeu de résultats de:
Section Unit
1 1
1 2
1 3
1 4
1 5
2 0
2 1
2 2
3 1
Notez que certaines des valeurs dans les sections CTE seront les paramètres, il est donc pas aussi simple que l'extension de mes UNIONs au numéro.
UPDATE
J'ai pensé à ce sujet un peu plus et une autre ligne directrice. Je vais prendre une réponse qui est correcte, mais espérais en particulier pour quelqu'un peut montrer comment faire avec CONNECT BY PRIOR et sans CTE supplémentaire au milieu ...
Je compris que je pouvais changer le CTE à ceci:
WITH Sections AS (
SELECT 1 Section, LEVEL Unit FROM DUAL CONNECT BY LEVEL <= 5
UNION ALL SELECT 2, LEVEL - 1 FROM DUAL CONNECT BY LEVEL <= 3
UNION ALL SELECT 3, 1 FROM DUAL CONNECT BY LEVEL <= 1
)
Mais je penche loin de ça ici parce qu'il peut provenir d'une table plutôt que d'être choisis parmi DUAL. Donc, supposons que les sections CTE est en fait une simple requête à partir d'une table, quelque chose comme:
SELECT Section, StartUnit, EndUnit FROM SectionData WHERE CallerID = 7
Et la question initiale est toujours valable.
La solution
Essayez ceci:
WITH Sections AS (
SELECT 1 Section, 1 StartUnit, 5 EndUnit FROM DUAL
UNION ALL SELECT 2, 0, 2 FROM DUAL
UNION ALL SELECT 3, 1, 1 FROM DUAL
),
Numbers AS (
SELECT ROWNUM-1 n
FROM DUAL
CONNECT BY LEVEL < 1000
)
select section, n
from sections, numbers
where n between startunit and endunit
order by section, n;
Vous pouvez ajuster la valeur de 1000 je.