2016-04-29 69 views
3

我有2个表如下生成与SQL查询多个数据

Product_Asset:

PAId  Tracks 
1   2 
2   3 

Product_Asset_Resource:

Id  PAId  TrackNumber 
1   1    1 
2   1    2 
3   2    1 
4   2    2 
5   2    3 

我想知道我是否能够产生product_asset_resource表中的数据基于product_asset表使用TSQL查询(不复杂的光标等)

例如,如果轨道的在product_asset数目是3,然后我需要与轨道号来填充3行中product_asset_resource 1,2,3-

+1

你需要有一个数字表(或使用虚拟理货表)。只需加入数字<=曲目 –

回答

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

教我一些我不知道的+1。 –

+1

@rontornambe很高兴我能帮到你。你可以用Tally Table做很多事情。我建议你阅读参考文章。 –

+1

优秀的解决方案。 –

0

试试这个,我没有使用任何理货表

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。

+0

递归CTE在大数据上不能很好地缩放。请阅读Jeff Moden的[** this **](http://www.sqlservercentral.com/articles/T-SQL/74118/)优秀文章。 –