我写了一个查询生成指定范围内的数字。
我有一张table
NUM_RANGES
ID START_NUMBER END_NUMBER
-- ------------ ----------
1 1 5
2 6 10
我需要得到这个结果:
ID NUMBER
-- ------
1 1
1 2
1 3
1 4
1 5
2 6
2 7
2 8
2 9
2 10
通过这个查询,我可以得到正确的结果,但仅限于where子句中指定的id:
select id, start_number + level - 1 next_tag
from (select id, start_number,end_number
from NUM_RANGES
where id = 1
)
connect by level <= end_number - start_number + 1
如果没有“where id = 1”,我会得到62行重复的数据,其中distinct有帮助,但对于更大的范围1 - 200,200- 500,它工作得太慢了。
谢谢你的帮助!
4条答案
按热度按时间bt1cpqcv1#
在Oracle 12c上,可以使用CROSS APPLY:
5rgfhyps2#
在Oracle 11.2及更早版本中,可以使用分层查询:
具体来说,如果不使用相同的
id
将新行链接到现有行,就会生成大量不必要的行。这就是为什么你需要prior id = id
。需要附加条件prior sys_guid() is not null
,以便Oracle不会看到它不应该看到的周期(这正是由“prior id = id
”引起的)。在Oracle 12.1或更高版本中,可以使用
lateral
子句:z3yyvxxp3#
这个应该能用速度也很快。
zwghvu4y4#
您可以使用分层查询:
其中,对于样本数据:
输出:
| ID| NMBR|
| - -----|- -----|
| 1| 1|
| 1| 2|
| 1| 3|
| 1| 4|
| 1| 5个|
| 2|六|
| 2|七个|
| 2|八|
| 2|九个|
| 2|十个|
fiddle