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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top