根据字段值重复返回记录

时间:2013-10-18 16:04:47

标签: sql firebird firebird2.5

我有一张这样的表

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中的任何拼写错误我只关注主要想法。

2 个答案:

答案 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