我有一张看起来像这样的表
+-------+------+------+----------+
| 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查询的经验,所以非常感谢帮助。
答案 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)