如何选择数据库中的值所指示的记录数

时间:2014-01-23 16:59:53

标签: sql sybase-ase

我在关系数据库Sybase ASE中有一个表,列数很少。其中三个看起来像这个例子:

 _____________
|   Product   |
---------------
| ProductId   |

| Name        |

| Quantity    |
 _____________

所以我们有一些记录:

__________________________________
| ProductId | Name    | Quantity |
----------------------------------
|    1      | pants   |     2    |
|    2      | shirt   |     1    |
|    3      | sweater |     3    |
----------------------------------

我需要将每个名称的次数与此产品的“数量”一样多。

所以结果应该是这样的:

  • 裤子
  • 裤子
  • 衬衫
  • 毛衣
  • 毛衣
  • 毛衣

如果有人知道我该怎么做,请帮助我。

修改 2014-01-24 14:17 UTC + 1

我要感谢大家。戈登的解决方案真的很好,但对于我的情况(更大的数量)我不能使用该SQL。我尝试像333kenshin和simon的解决方案那样做一些但没有光标。我喜欢这样的事情:

IF OBJECT_ID('#TEMP') is not null
DROP TABLE #TEMP

create  TABLE #TEMP (Name varchar(255)) 

DECLARE @Name varchar(255)
DECLARE @Quant INT
DECLARE @prodId INT
SET @prodId = 1

WHILE (EXISTS(SELECT 1 FROM product WHERE productID = @prodId))
BEGIN
    SELECT
        @Name = Name
        @Quant = Quantity
    FROM Product

    DECLARE @i INT
    SET @i = 1
    WHILE @i <= @Quant
        BEGIN
            insert into #TEMP
            values(@Name)
            SELECT @i=@i+1
        END
    SELECT @prodId = @prodId + 1
END

select * from #TEMP
drop table #TEMP

对我来说,我的数据库是最快的解决方案。非常感谢每一个答案。

3 个答案:

答案 0 :(得分:1)

为此,您需要一系列整数。您可以手动生成一个:

select p.name
from product p join
     (select 1 as n union all select 2 union all select 3 union all select 4
     ) n
     on n.n <= p.quantity;

如果quantity不是太大而且您可以在n中输入值,这将有效。

答案 1 :(得分:0)

您可以使用临时表。选择所有产品行,然后遍历返回的每一行。对于每个产品,循环数量时间并在循环中将产品插入临时表。我不是Sybase用户,所以我不能给你语法,但你会有一个存储过程,它会做类似的事情:

select all rows from product into a cursor
for each row
    for i = 1 to row.Quantity
        insert into temp (Name) values (row.Name)  
    next
end loop

select * from temp and return it

但这是一个非常古怪的要求。

编辑:戈登的解决方案很整洁!如果n永远不会变得太大,我会选择那个!

答案 2 :(得分:0)

执行此操作的正确方法是临时表+游标:

  1. 创建临时表
  2. 创建cursor以遍历Product table
  3. 在光标内,创建一个内部WHILE loop
  4. 退出循环,最后选择临时表
  5. 以下不是100%正确的Sybase语法,但它非常接近。

    -- 1: temp table
    select productName into #TEMP
    
    -- 2: cursor
    declare
        @productName char(10),
        @quantity int
    declare ProductRead CURSOR for
    select
        productName,
        quantity
    from
        Product
    
    OPEN ProductRead
    FETCH ProductRead
    INTO
        @productName,
        @quantity
    
    WHILE (@@sqlstatus=0)
    BEGIN
    
    -- 3: inner for loop
    DECLARE @i INT
    SET @i = 1
    WHILE @i <= @quantity
    BEGIN
    insert @productName into #TEMP
    END
    
    END
    
    -- 4: final result set 
    select productName from #TEMP