我有一张这样的表:
|---------|-----|
| Name | Qty |
|---------|-----|
| Joe | 3 |
| Bill | 2 |
| Mike | 4 |
|---------|-----|
我正在尝试创建一个将返回此内容的SELECT
语句:
|--------|
| Name |
|--------|
| Joe |
| Joe |
| Joe |
| Bill |
| Bill |
| Mike |
| Mike |
| Mike |
| Mike |
|--------|
基本上,无论Qty
字段设置为什么,都会返回Name
的次数。我发现了一个非常相似的问题here,但这个问题适用于Oracle而我正在使用SQL Server。我也希望在SELECT
语句中执行此操作(因为它稍后将在视图中使用),而不必使用临时表或游标。
答案 0 :(得分:7)
您可以使用递归cte来执行此操作
<强> SQL Fiddle Example 强>
;with cte
as
(select * from table1
union all
select name, qty - 1
from cte
where qty - 1 > 0
)
select name from cte
order by name
答案 1 :(得分:1)
您也可以使用计数器或数字表来执行此操作。这样的递归cte的问题在于它实际上是一行一行的流程。此方法基于100%设置。
create table #table1
(
Name varchar(10),
Qty int
);
insert #table1
select 'Joe', 3 union all
select 'Bill', 2 union all
select 'Mike', 4;
WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
Numbers(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E1
)
select *
from #table1 t
join numbers n on n.N <= t.Qty
drop table #table1