SQL Server 2008 R2——使用数目字辅助表(master.spt_values)实现用计数字段对记录进行重复显示

SQL Server 2008 R2——使用数字辅助表(master..spt_values)实现用计数字段对记录进行重复显示

=================================版权声明=================================

版权声明:原创文章 谢绝转载 

请通过右侧公告中的“联系邮箱(wlsandwho@foxmail.com)”联系我

勿用于学术性引用。

勿用于商业出版、商业印刷、商业引用以及其他商业用途。                   

 

本文不定期修正完善。

本文链接:http://www.cnblogs.com/wlsandwho/p/5075789.html

耻辱墙:http://www.cnblogs.com/wlsandwho/p/4206472.html

=======================================================================

没啥说的,鄙视那些无视版权随意抓取博文的爬虫小网站站长,圣诞了,祝你们见到上帝。

=======================================================================

SQL Server 2008 R2——使用数目字辅助表(master.spt_values)实现用计数字段对记录进行重复显示

=======================================================================

从来只见过有人要用distinct去重,可没听说过谁还要生成重复数据的。今儿咱算是开了眼了。

上代码吧。

 1 --by WLS
 2 --20151224
 3 --网络代码有风险复制粘贴须谨慎
 4 USE tempdb
 5 GO
 6 
 7 IF OBJECT_ID (N't_TestbyWLS', N'U') IS NOT NULL
 8 DROP TABLE t_TestbyWLS;
 9 CREATE TABLE t_TestbyWLS(Id INTEGER PRIMARY KEY,Name NVARCHAR(15),Qty INTEGER)
10 GO
11 
12 INSERT INTO t_TestbyWLS VALUES
13 (1,'thbytwo',3),
14 (2,'wlsandwho',2)
15 GO
16 
17 SELECT * FROM t_TestbyWLS
18 GO
19 
20 -------------------------------------------------------------------------------------------
21 WITH TempQty
22 AS
23 (
24     SELECT number AS Num FROM master..spt_values WHERE type='p'
25 )
26 SELECT a.Id,a.Qty FROM t_TestbyWLS a LEFT JOIN TempQty b ON b.Num>0 AND b.Num<=a.Qty
27 GO

分步思路

 1 -------------------------------------------------------------------------------------------
 2 --step0
 3 SELECT number AS Num FROM master..spt_values WHERE type='p'
 4 GO
 5 --step1
 6 WITH TempQty
 7 AS
 8 (
 9     SELECT number AS Num FROM master..spt_values WHERE type='p'
10 )
11 SELECT a.Id,a.Qty,b.Num FROM t_TestbyWLS a LEFT JOIN TempQty b ON 1=1
12 --step2
13 WITH TempQty
14 AS
15 (
16     SELECT number AS Num FROM master..spt_values WHERE type='p'
17 )
18 SELECT a.Id,a.Qty,b.Num FROM t_TestbyWLS a LEFT JOIN TempQty b ON 1=1 AND b.Num>0 AND b.Num<=a.Qty
19 --step3
20 WITH TempQty
21 AS
22 (
23     SELECT number AS Num FROM master..spt_values WHERE type='p'
24 )
25 SELECT a.Id,a.Qty FROM t_TestbyWLS a LEFT JOIN TempQty b ON b.Num>0 AND b.Num<=a.Qty
26 GO

执行结果

SQL Server 2008 R2——使用数目字辅助表(master.spt_values)实现用计数字段对记录进行重复显示

执行计划

SQL Server 2008 R2——使用数目字辅助表(master.spt_values)实现用计数字段对记录进行重复显示

=======================================================================

本着从业务出发的原则,我问了下事主为何有这种浪(wéi)费(bèi)空(lì)间(shǐ)、低(bù)效(rén )率(dào )、违(pò)反(huài)数(rì)据(nèi)库(wǎ)范(tiáo)式(yuē)的需求,

下面是问答截图。

SQL Server 2008 R2——使用数目字辅助表(master.spt_values)实现用计数字段对记录进行重复显示

看来是软件架构设计的问题了,不予置评。

=======================================================================

SQL Server 2008 R2——使用数目字辅助表(master.spt_values)实现用计数字段对记录进行重复显示

(友情支持请扫描这个)

微信扫描上方二维码捐赠

 

2楼王林森
等我不做程序员了,我觉得可以把在群里回答的问题编订成册,,弄成类似“SQL Server 2008R2 应用问答300例”之类的东西。,1 “请问XXXXXXX应该怎么办?”“自己百度。”,2 “有谁知道XXXXXXXXXXX?”“@谁。”,3 quot;我写的XXXX为什么不行?quot;“外包给微软让他给你定做一个语法。”,……,
1楼剑走江湖
如果将数字辅助表封装为一个真是的物理数据表或表函数来处理,处理方式更简单的。我的思路存在一个数字辅助物理表,然后通过这个数字表和你的这张表进行inner join也能实现,具体的T-SQL如下:,IF OBJECT_ID(N#39;dbo.Nums#39;, #39;U#39;) IS NOT NULLBEGINDROP TABLE dbo.Nums;ENDGOCREATE TABLE dbo.Nums (Num INT NOT NULL,CONSTRAINT PK_U_CL_Nums_Num PRIMARY KEY CLUSTERED(Num ASC) );GOINSERT INTO dbo.Nums (Num)SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RowNumFROM master.dbo.spt_valuesORDER BY RowNum;GOSELECT T.Id , T.Name FROM dbo.t_TestbyWLS AS TINNER JOIN dbo.Nums AS T2ON T.Qty gt;= T2.Num;GO,以上只是一种实现思路。还有另外一个实现思路,那就是将数字辅助表封装在内联表函数中,使用CROSS JOIN也可以实现。博主可以尝试实现哈。希望对博主有帮助。