我有一张这样的表
Name Qty
----- -----
BD 2
SD 1
XE 3
我需要根据字段Qty
值重复返回此表记录。例如,第一行将以相同的值重复两次。
我正在考虑在存储过程中使用带有返回参数的嵌套FOR Select
For Select name, qty from mytable into :name, :qty do
begin
if (qty > 1 ) then begin
i = 1; -- should I start from 2 ?
while (i <= :qty) do
begin
for select name, qty from mytable into :name1, :qty1 do ...
SUSPEND;
i = i + 1;
end
end
SUSPEND;
end
此存储过程是否可以返回正确的结果,还是应该使用其他方式?
我使用FireBird 2.5并请丢弃之前SQL中的任何拼写错误我只关注主要想法。
答案 0 :(得分:3)
如果你有一个Numbers表,这是微不足道的:
SELECT
OT.Name
FROM
OrigTable AS OT
INNER JOIN Numbers AS N ON N.Number BETWEEN 1 AND OT.Qty
我对Firebird并不熟悉,但我相信这种非常简单的语法适用。
答案 1 :(得分:3)
您可以使用自版本2.1支持的recursive CTE,类似
WITH RECURSIVE tQty AS(
SELECT ta.name, ta.qty
FROM T ta
WHERE(ta.qty > 0)
UNION ALL
SELECT tb.name, tb.qty-1
FROM tQty tb
WHERE(tb.qty-1 > 0)
)
SELECT name,qty FROM tQty
ORDER BY name