【问题标题】:Correlated row-generating query in OracleOracle 中的相关行生成查询
【发布时间】:2011-01-21 00:41:03
【问题描述】:

鉴于此起始 CTE:

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
), 

如何生成一个结果集,该结果集在 Section 中每行的行数与 StartUnit 和 EndUnit(包括)之间的数字一样多,并且值递增?

也就是说,我希望看到以下结果集:

Section  Unit
1        1
1        2
1        3
1        4
1        5
2        0
2        1
2        2
3        1

请注意,Sections CTE 中的某些值将是参数,因此它不像将我的 UNION 扩展到正确的数字那么简单。

更新

我对此进行了更多思考,并制定了另一条准则。我会接受任何正确的答案,但特别希望有人能够展示如何使用 CONNECT BY PRIOR 来做到这一点,并且中间没有额外的 CTE...

我意识到我可以将 CTE 更改为:

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
)

但我在这里倾向于远离它,因为它可能来自一个表,而不是从 DUAL 中选择的。因此,我们假设 Sections CTE 实际上是来自表的简单查询,例如:

SELECT Section, StartUnit, EndUnit FROM SectionData WHERE CallerID = 7

原来的问题仍然存在。

【问题讨论】:

    标签: sql oracle11g simplification connect-by


    【解决方案1】:

    试试这个:

    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;
    

    您可能需要调整我使用的 1000 的值。

    【讨论】:

    • 感谢您的回复。你能想出什么方法在没有干预 CTE 的情况下做到这一点,也许使用 CONNECT BY PRIOR 或其他什么?
    猜你喜欢
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多