--借助臨時表
Create Table A
(AA1 Char(3),
 AA2 Nvarchar(10),
 AA3 Int)
Insert A Select '010',      N'北京',      5
Union All Select '021',      N'上海',      3
Union All Select '022',      N'天津',      4
Union All Select '023',      N'重庆',      2
GO
Select TOP 1000 ID=Identity(Int,1,1) Into # From syscolumns,SysObjectsSelect A.AA1,A.AA2 From A
Inner Join # B
On A.AA3>=B.IDGO
Drop Table A,#
--Result
/*
AA1 AA2
010 北京
010 北京
010 北京
010 北京
010 北京
021 上海
021 上海
021 上海
022 天津
022 天津
022 天津
022 天津
023 重庆
023 重庆
*/

解决方案 »

  1.   

    为什么:Select TOP 1000 ID=Identity(Int,1,1) Into # From syscolumns,SysObjects
    中没有 TOP 1000 时,查询非常慢,
    若是A表的数据量很大,或者说突破1000又改如何?谢谢
      

  2.   

    這裡的1000不是取決於A的數據量,而是AA3的最大值。如果AA3的最大值不會超過1000,就不要改動。當然,如果AA3的最大值會更小,可以適當將1000改小。如果去掉1000,
    Select ID=Identity(Int,1,1) Into # From syscolumns,SysObjects
    這個的數據量就會非常大,當然會很慢。
      

  3.   

    ----生成临时数据
    DECLARE @A Table
    (AA1 Char(3),
     AA2 Nvarchar(10),
     AA3 Int)
    Insert @A Select '010',      N'北京',      5
    Union All Select '021',      N'上海',      3
    Union All Select '022',      N'天津',      4
    Union All Select '023',      N'重庆',      2----定义递规查询变量
    DECLARE @City VARCHAR(8000)
    SET @City=''SELECT @City=@City + REPLICATE(AA2 + ',',AA3) FROM @A
    SELECT @City=LEFT(@City,LEN(@City)-1)----生成结果数据
    SELECT AA1,a FROM dbo.Split(@City,',') INNER JOIN @A ON AA2=a
    ----附Split函数
    CREATE Function Split(@Sql varchar(8000),@Splits varchar(10))
    returns @temp Table (a varchar(100))
    As
    Begin
    Declare @i Int
    Set @Sql = RTrim(LTrim(@Sql))
    Set @i = CharIndex(@Splits,@Sql)
    While @i >= 1
    Begin
    Insert @temp Values(Left(@Sql,@i-1))
    Set @Sql = SubString(@Sql,@i+1,Len(@Sql)-@i)
    Set @i = CharIndex(@Splits,@Sql)
    EndIf @Sql <> ''
    Insert @temp Values (@Sql)
    Return
    End
      

  4.   

    paoluo(一天到晚游泳的鱼) ( ) 信誉:100  2006-6-13 16:00:27  得分: 20  
    能问一下为什么要用syscolumns和sysobjects这两个表?