【问题标题】:Returning repeating number of rows in SQL在 SQL 中返回重复的行数
【发布时间】:2014-07-30 17:31:54
【问题描述】:

我有一张这样的桌子:

|---------|-----|
| 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 语句中执行此操作(因为稍后将在视图中使用它)而不是必须使用临时表或游标。

【问题讨论】:

    标签: sql sql-server sql-server-2008


    【解决方案1】:

    您可以使用递归 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
    

    【讨论】:

      【解决方案2】:

      您也可以使用计数表或数字表来执行此操作。像这样的递归 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-12
        • 1970-01-01
        • 2019-09-03
        • 1970-01-01
        • 2018-03-01
        • 2021-08-30
        • 2022-09-23
        相关资源
        最近更新 更多