【问题标题】:Generate rows for each number in integer为整数中的每个数字生成行
【发布时间】:2023-04-06 03:35:01
【问题描述】:

我有一张 ROADS 表:

with cte as (
select      1 as road_id,      2 as num_vertices    from dual
union all
select      2 as road_id,   null as num_vertices    from dual
union all
select      3 as road_id,   1000 as num_vertices    from dual
)
select
    *
from
    cte

   ROAD_ID NUM_VERTICES
---------- ------------
         1            2
         2         null
         3         1000

对于每条道路,我想为每个顶点生成行:

   ROAD_ID       VERTEX
---------- ------------
         1            1
         1            2
         3            1
         3            2
         3          ...
         3         1000  

问题:

有没有办法在 SELECT 查询中为每个 NUM_VERTICES 整数生成行?

【问题讨论】:

标签: sql oracle select oracle18c


【解决方案1】:

CONNECT BY 和 CROSS JOIN 似乎也可以解决问题:

select level as vertex from dual connect by level <= (select max(cte.num_vertices) from cte )

完整的查询:

with cte as (
select      1 as road_id,      2 as num_vertices    from dual
union all
select      2 as road_id,   null as num_vertices    from dual
union all
select      3 as road_id,   1000 as num_vertices    from dual
),
numbers as (select level as vertex from dual connect by level <= (select max(cte.num_vertices) from cte ))
select
    *
from
    cte
cross join
     numbers
where    
    vertex <= num_vertices
order by
    road_id,
    vertex

db<>fiddle

【讨论】:

    【解决方案2】:

    一种方法是递归 CTE:

    with cte as (
          select      1 as road_id,      2 as num_vertices    from dual
          union all
          select      2 as road_id,   null as num_vertices    from dual
          union all
          select      3 as road_id,   1000 as num_vertices    from dual
         ),
         rcte (road_id, vertex, num_vertices) as (
          select road_id, 1 as vertex, num_vertices
          from cte
          where num_vertices > 0
          union all
          select road_id, vertex + 1, num_vertices
          from rcte
          where vertex < num_vertices
         )
    select road_id, vertex
    from rcte;
    

    Here 是一个 dbfiddle。

    【讨论】:

    • @User1973 。 . .我更喜欢递归 CTE,因为它们是标准 SQL 的一部分。另一方面,connect 在 Oracle 中已经有很长时间了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 2021-07-22
    相关资源
    最近更新 更多