使用SQL查询生成多个数据

时间:2016-04-29 02:59:55

标签: sql sql-server tsql

我有2张表格如下

Product_Asset:

text

Product_Asset_Resource:

PAId      Tracks
1          2
2          3

我想知道是否可以使用TSQL查询(没有复杂的游标等)基于Id PAId TrackNumber 1 1 1 2 1 2 3 2 1 4 2 2 5 2 3 表在product_asset_resource表中生成数据。

例如,如果product_asset中的曲目数为3,那么我需要在product_asset中填充3行,曲目编号为1,2,3

2 个答案:

答案 0 :(得分:4)

您可以借助Tally Table

来完成此操作
WITH E1(N) AS( -- 10 ^ 1 = 10 rows
    SELECT 1 FROM(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t(N)
),
E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b), -- 10 ^ 2 = 100 rows
E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b), -- 10 ^ 4 = 10,000 rows
CteTally(N) AS(
    SELECT TOP(SELECT MAX(Tracks) FROM Product_Asset) 
        ROW_NUMBER() OVER(ORDER BY(SELECT NULL))
    FROM E4
)
SELECT
    Id  = ROW_NUMBER() OVER(ORDER BY pa.PAId, t.N),
    pa.PAId,
    TrackNumber = t.N
FROM Product_Asset pa
INNER JOIN CteTally t
    ON t.N <= pa.Tracks

ONLINE DEMO

答案 1 :(得分:0)

试试这个,我没有使用任何 Tally Table

declare @Product_Asset table(PAId int,Tracks int)
insert into @Product_Asset values (1 ,2),(2, 3)

;with CTE as
(
select PAId,1 TrackNumber from @Product_Asset
union all

select  pa.PAId,TrackNumber+1 from @Product_Asset pa
inner join cte c on pa.PAId=c.PAId
where c.TrackNumber<pa.Tracks
)

select ROW_NUMBER()over(order by paid)id, * from cte 

恕我直言,递归CTE或子查询或使用临时表性能取决于示例的例子。

我发现递归CTE更具可读性,除非出现性能问题,否则不会使用它们。

我不相信递归CTE是隐藏的RBAR。 CTE只是语法,所以理论上它只是一个子查询

我们可以举一个例子来证明使用#Temp表会提高性能,但这并不意味着我们总是使用临时表。

同样在这个例子中使用Tally Table可能无法改善性能,这并不意味着我们应该根据Tally Table的帮助。