有个表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 之类的循环完成

解决方案 »

  1.   

    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 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 油
    */
      

  2.   

    --如果sl的值可能會比較大,可以將生成的臨時表的ID設置的更大些。--建立測試環境
    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 油
    */
      

  3.   

    虽然可以达到目的,但还不是最佳答案,因为要是通过建立1~1000临时ID表再连接产生答案的话,就不能算是用查询语句完成的了。
    可不可以用select Top 100 Identity(bigint, 1, 1) from ...再连接A表完成呢? 
      

  4.   

    可不可以用select Top 100 Identity(bigint, 1, 1) from ...再连接A表完成呢? 
    ------------
    不行的。IDENTITY (函數)
    僅使用在有 INTO table 子句的 SELECT 陳述式,以將識別資料行插入新的資料表。
      

  5.   

    declare @a table(ID varchar(4),mc varchar(10),sl int)
    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   油
    */
      

  6.   

    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用表变量:
    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 行受影响)
      

  7.   

    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這個方法不錯。但是如果數據庫中的表太少了的話,就有點問題,不過這種情況不常見。
      

  8.   

    libin_ftsafe的方法有点看不懂,我是初学者能解释一下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这句话的意思吗?还有就是SYSCOLUMNS.COLID是表述什么的呢?
    总体感觉语言很精练啊,可就是有点搞不明白为什么这么写。
      

  9.   

    上面那句是生成1--1000的序列数,利用"where a.sl>=b.num"控制源表中每条记录要显示的行数.
    SYSCOLUMNS.COLID: SYSCOLUMNS表中的COLID字段存储的是每张表的列序号
      

  10.   

    这句话的意思吗?还有就是SYSCOLUMNS.COLID是表述什么的呢?
    ---------------------------------------------------------------------
    这一句SQL利用了系统表syscolumns的两个列:
    id    -- 该记录所对应的列所在表的id
    colid -- 该记录所对应的列在所在表中的序号SQL语句的用意:
    利用id与colid组合不存在重复的特征,按照id/colid排序的顺序,获得一个连续的序列。