基于条件SQL复制行

时间:2018-02-01 07:49:15

标签: sql sql-server database database-table

我有一张看起来像这样的表

+-------+------+------+----------+ 
| Index |  F1  |  F2  | Multiply | 
+-------+------+------+----------+
|  0    |  LG  |  SC  |     1    |
|  1    |  WE  |  CC  |     1    |
|  2    |  TY  |  PL  |     2    |
+-------+------+------+----------+

我希望乘以“乘法”'按列2确定要添加到结果的行数。通过上面的示例,我希望我的SQL查询返回:

+------+-----+-----+
|Index | F1  | F2  |
+------+-----+-----+
|  0   |  LG | SC  | 
|  0   |  LG | SC  |
|  1   |  WE | CC  |
|  1   |  WE | CC  |
|  2   |  TY | PL  |
|  2   |  TY | PL  |
|  2   |  TY | PL  |
|  2   |  TY | PL  |
+------+-----+-----+

我没有多少编写SQL查询的经验,所以非常感谢帮助。

2 个答案:

答案 0 :(得分:7)

试试这个

with myTable as (
    select * from (values 
        (0,'LG','SC',1)
        ,(1,'WE','CC',1)
        ,(2,'TY','PL',2)
    ) t ([Index], F1, F2, Mutiply)
)
select
    [Index], F1, F2
from
    myTable m
    join master.dbo.spt_values v on m.Mutiply * 2 > v.number
where
    Type = 'P'

编辑:添加一些描述

通过编写像

这样的查询
select * from table 
cross join (values (1),(2)) t(n)

我们可以在表格中加倍。 cross join (values (1),(2),(3),(4)) t(n)将使行数翻两番。在这种情况下,行乘法将取决于列Multiply。所以我们需要乘以列Multiply的2值并与表格连接,数字序列(0,1,2,3,4,5,6,7 ...),其中数字小于计算值。例如,对于Multiply = 2,连接条件将是4个数字(0,1,2,3),小于2 * 2。这4个数字将使初始行增加四倍。

master.dbo.spt_values仅用于获取数字序列。可以在运行时生成序列,也可以使用其他表格来生成序列

答案 1 :(得分:2)

另一种方法是使用递归CTE:

;WITH cte AS (
    SELECT *
    FROM (VALUES
    (0, 'LG', 'SC', 1),
    (1, 'WE', 'CC', 1),
    (2, 'TY', 'PL', 2)
    ) as t([Index], F1, F2, Multiply)
), final AS (
    SELECT  [Index], 
            F1, 
            F2, 
            Multiply*2 as Multiply 
    FROM cte  -- At first we get basic recordset with x2 in Multiply
    UNION ALL 
    SELECT  [Index], 
            F1, 
            F2, 
            Multiply-1
    FROM final  -- On each iteration we select columns we need and
    WHERE Multiply-1 > 0   -- use Multiply as counter
)

SELECT  [Index], 
        F1, 
        F2
FROM final
ORDER by [Index]

输出:

Index       F1   F2
----------- ---- ----
0           LG   SC
0           LG   SC
1           WE   CC
1           WE   CC
2           TY   PL
2           TY   PL
2           TY   PL
2           TY   PL

(8 rows affected)