有个表a
ID mc sl
01 肉类 3
02 米类 5
03 油 4
.......如何自动按SL字段值重复显示各条记录,最终变成:
ID mc
01 肉类
01 肉类
01 肉类
02 米类
02 米类
02 米类
02 米类
02 米类
03 油
03 油
03 油
03 油
.......首先声明只能通过查询SQL语句来完成,用变量循环插入的不算。
不能用
insert into 之类的循环完成
ID mc sl
01 肉类 3
02 米类 5
03 油 4
.......如何自动按SL字段值重复显示各条记录,最终变成:
ID mc
01 肉类
01 肉类
01 肉类
02 米类
02 米类
02 米类
02 米类
02 米类
03 油
03 油
03 油
03 油
.......首先声明只能通过查询SQL语句来完成,用变量循环插入的不算。
不能用
insert into 之类的循环完成
(ID Char(2),
mc Nvarchar(10),
sl Int)
Insert A Select '01', N'肉类', 3
Union All Select '02', N'米类', 5
Union All Select '03', N'油', 4
GO
Select Top 100 Identity(Int, 1, 1) As ID Into #T from Sysobjects A, Sysobjects BSelect
A.ID,
A.mc
From
A
Inner Join
#T B
On A.sl >= B.IDDrop Table #T
GO
Drop Table A
/*
ID mc
01 肉类
01 肉类
01 肉类
02 米类
02 米类
02 米类
02 米类
02 米类
03 油
03 油
03 油
03 油
*/
Create Table A
(ID Char(2),
mc Nvarchar(10),
sl Int)
Insert A Select '01', N'肉类', 3
Union All Select '02', N'米类', 5
Union All Select '03', N'油', 4
GO
--測試
Select Top 1000 Identity(Int, 1, 1) As ID Into #T from Sysobjects A, Sysobjects BSelect
A.ID,
A.mc
From
A
Inner Join
#T B
On A.sl >= B.IDDrop Table #T
GO
--刪除測試環境
Drop Table A
--結果
/*
ID mc
01 肉类
01 肉类
01 肉类
02 米类
02 米类
02 米类
02 米类
02 米类
03 油
03 油
03 油
03 油
*/
可不可以用select Top 100 Identity(bigint, 1, 1) from ...再连接A表完成呢?
------------
不行的。IDENTITY (函數)
僅使用在有 INTO table 子句的 SELECT 陳述式,以將識別資料行插入新的資料表。
insert into @a select '01','肉类',3
insert into @a select '02','米类',5
insert into @a select '03','油' ,4select
a.ID,a.mc
from
@a a,
(select
top 1000 (select count(1) from syscolumns where id<t.id or (id=t.id and colid<=t.colid)) as num
from
syscolumns t) b
where
a.sl>=b.num
order by
ID,MC/*
ID mc
---- ----------
01 肉类
01 肉类
01 肉类
02 米类
02 米类
02 米类
02 米类
02 米类
03 油
03 油
03 油
03 油
*/
(ID Char(2),
mc Nvarchar(10),
sl Int)
Insert A Select '01', N'肉类', 3
Union All Select '02', N'米类', 5
Union All Select '03', N'油', 4用表变量:
declare @ta table(id int)--生成1—50递增的表变量
declare @i int,@j int
select @i=1,@j=50--定义字符的最大数量
while @i!>@j
begin
insert @ta select @i
select @i=@i+1
end
select a.id,a.mc
from a join @ta b on a.sl>=b.id order by id(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)
id mc
---- ----------
01 肉类
01 肉类
01 肉类
02 米类
02 米类
02 米类
02 米类
02 米类
03 油
03 油
03 油
03 油(12 行受影响)
top 1000 (select count(1) from syscolumns where id<t.id or (id=t.id and colid<=t.colid)) as num
from
syscolumns t這個方法不錯。但是如果數據庫中的表太少了的話,就有點問題,不過這種情況不常見。
top 1000 (select count(1) from syscolumns where id<t.id or (id=t.id and colid<=t.colid)) as num
from
syscolumns t这句话的意思吗?还有就是SYSCOLUMNS.COLID是表述什么的呢?
总体感觉语言很精练啊,可就是有点搞不明白为什么这么写。
SYSCOLUMNS.COLID: SYSCOLUMNS表中的COLID字段存储的是每张表的列序号
---------------------------------------------------------------------
这一句SQL利用了系统表syscolumns的两个列:
id -- 该记录所对应的列所在表的id
colid -- 该记录所对应的列在所在表中的序号SQL语句的用意:
利用id与colid组合不存在重复的特征,按照id/colid排序的顺序,获得一个连续的序列。