【问题标题】:Multiply rows in single query在单个查询中乘以行
【发布时间】:2017-12-27 13:24:17
【问题描述】:

Table1有以下2列4行:

Entity Number
------ ------
Car    4
Shop   1
Apple  3
Pear   1

我想要一组基于 SQL 查询,它会产生以下所需的结果。基本上是通过 Number 列中的 Number 来复制 Entities。

我只能通过逐行循环来做到这一点,这不是很优雅,也不是基于集合的。

想要的结果:

Entity
------
Car   
Car   
Car   
Car   
Shop  
Apple 
Apple 
Apple 
Pear  

【问题讨论】:

    标签: sql sql-server tsql sql-server-2014


    【解决方案1】:

    一种方法使用递归 CTE:

    with cte as (
          select t1.entity, t1.number
          from table1 t1
          union all
          select cte.entity, cte.number - 1
          from cte
          where cte.number > 0
         )
    select entity
    from cte;
    

    注意:使用默认设置,这限制为每个实体 100 行。你可以使用OPTION (MAXRECURSION 0) 来解决这个问题。

    你也可以用一个数字表来解决这个问题,但是这样的问题是递归 CTE 的一个很好的介绍。

    【讨论】:

    • 第一个解决方案,完美运行,标记为答案......我自己需要深入研究递归查询
    【解决方案2】:

    使用这个

    ;WITH CTE
    AS
    (
        SELECT
            SeqNo = 1,
            Entity,
            Number
            FROM YourTable
    
        UNION ALL
    
        SELECT
            SeqNo = SeqNo+1,
            Entity,
            Number
            FROM CTE
                WHERE SeqNo < Number
    )
    SELECT
        Entity
        FROM CTE
            ORDER BY 1
    

    【讨论】:

      【解决方案3】:

      一个非递归的解决方案,将使用一个固定的序列号,然后根据这个数字加入表,如下所示:

      WITH numbers
      AS
      (
        SELECT n
        FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9), (10)) AS numbers(n)
      )
      SELECT t.Entity
      FROM Table1 AS t
      INNER JOIN numbers as n ON t.number >= n.n;
      

      这将支持最多10次复制,您可以添加额外的数字以支持额外的复制次数。

      Demo

      【讨论】:

        【解决方案4】:

        您可以使用 spt_values 作为数字表的来源

        select EntityList.* 
        from EntityList
        , (
        select number as n from master..spt_values WHERE Type = 'P' and Number between 1 and (select max(number) from EntityList)
        ) t
        where n <= number
        order by entity
        

        【讨论】:

        • spt_values 的有趣想法,从未使用过,+1 提示,谢谢
        猜你喜欢
        • 2011-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-19
        • 2021-11-01
        相关资源
        最近更新 更多