我有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
答案 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
答案 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的帮助。