我在关系数据库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
对我来说,我的数据库是最快的解决方案。非常感谢每一个答案。
答案 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)
执行此操作的正确方法是临时表+游标:
以下不是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