比方说,我有这个表:从单个查询返回多行,基于列的值
|Fld | Number|
1 5
2 2
我希望做一个选择,检索多达Fld
为Number
领域有:
|Fld |
1
1
1
1
1
2
2
我该如何做到这一点?我正在考虑制作一张临时表格,并根据Number
提供数据,但我想知道是否可以使用单个Select语句完成此操作。
PS:我是新来的SQL
比方说,我有这个表:从单个查询返回多行,基于列的值
|Fld | Number|
1 5
2 2
我希望做一个选择,检索多达Fld
为Number
领域有:
|Fld |
1
1
1
1
1
2
2
我该如何做到这一点?我正在考虑制作一张临时表格,并根据Number
提供数据,但我想知道是否可以使用单个Select语句完成此操作。
PS:我是新来的SQL
不是一个很好的解决方案(因为你还是查询您的表的两倍,但也许你可以从它的工作)
SELECT t1.fld, t1.number
FROM table t1, (
SELECT ROWNUM number FROM dual
CONNECT BY LEVEL <= (SELECT MAX(number) FROM t1)) t2
WHERE t2.number<=t1.number
它生成所需的最大数量的行,然后按每行进行过滤。
完美!非常感谢你。 – Roger
您可以用数字表连接:
SELECT Fld
FROM yourtable
JOIN Numbers
ON yourtable.Number <= Numbers.Number
Numbers表格仅仅是一个号码清单表:
Number
1
2
3
etc...
+1,可能是CTE的好时机,而不是为它创建表格。 –
我不知道你的RDBMS版本是否支持它(尽管我相当怀疑它的确如此),但这里是一个递归版本:
WITH remaining (fld, times) as (SELECT fld, 1
FROM <table>
UNION ALL
SELECT a.fld, a.times + 1
FROM remaining as a
JOIN <table> as b
ON b.fld = a.fld
AND b.number > a.times)
SELECT fld
FROM remaining
ORDER BY fld
鉴于你的源数据表,它输出这个(计数包括验证):
fld times
=============
1 1
1 2
1 3
1 4
1 5
2 1
2 2
@Roger - 对于SQL中的某些类型的分析,递归查询是重要的。学习它们。他们可以用来做各种有趣的事情。 –
这是什么味道的SQL? – Stu
什么数据库和版本? –
我不认为你可以用一个任意数字的Select语句来完成它,但你可以使用有限范围的数字或存储过程来完成。 – Neil