sql查询动态返回行数

时间:2013-08-26 19:37:32

标签: sql sql-server

我有一张表格

 CREATE TABLE [dbo].[table1](
[id] [bigint] IDENTITY(1,1) NOT NULL,
[clientid] [int] NULL,
[startdate] [int] NULL,
[copyid] [int] NULL

表中的数据格式为:

 id clientid startdate  copyid
 1       4        11    1
 2       4        12    1
 3       4        44    2
 3       5       123    1
 4       5        15    1
 5       5        12    2
 6       5        12    2
 7       5        12    2

copyid是clientid的子集

我的问题是我可以形成一个选择查询,它返回一个包含N行的表 并且是clientid和copyid组合的副本,其中copyid递增。

例如如果clientid为4,copyid为1,N为6,则应返回6行,如

  clientid startdate   copyid
  4        11           3
  4        12           3
  4        11           4
  4        12           4
  4        11           5
  4        12           5

N将始终是客户端和副本组合的倍数

我知道如何使用循环来做到这一点。但是可以使用单个选择查询吗?

1 个答案:

答案 0 :(得分:2)

这可以使用简单的光标来完成。

使用您在问题中提供的样本数据,我创建了以下解决方案:

DECLARE @ClientID INT = 4 
DECLARE @CopyID INT = 1 
DECLARE @N INT = 6

;WITH DATA 
     AS (SELECT *, 
                Row_number () 
                  OVER ( 
                    ORDER BY ID)           RN, 
                Count(*) 
                  OVER ( 
                    PARTITION BY CLIENTID) CID 
         FROM   (SELECT *, 
                        Max(COPYID) 
                          OVER ( 
                            PARTITION BY CLIENTID) MaxID, 
                        0                          AS root 
                 FROM   TABLE1)T 
         WHERE  CLIENTID = @clientid 
                AND COPYID = @Copyid), 
     CTE 
     AS (SELECT * 
         FROM   DATA 
         UNION ALL 
         SELECT t2.[ID], 
                t2.[CLIENTID], 
                t2.[STARTDATE], 
                t2.[COPYID], 
                t2.MAXID, 
                t2.ROOT + 1, 
                t2.RN + T2.CID RN, 
                T2.CID 
         FROM   DATA t1 
                INNER JOIN CTE t2 
                        ON t1.ID = t2.ID 
         WHERE  t2.RN < @N - 1) 
SELECT CLIENTID, 
       STARTDATE, 
       MAXID + ROOT + 1 COPYID 
FROM   CTE 
WHERE  RN <= @N 
ORDER  BY COPYID 

可以在SQL Fiddle找到一个工作示例。