2

我有一张表格

 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 将始终是客户端和副本组合的倍数

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

4

1 回答 1

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上找到一个工作示例。

于 2013-08-26T20:15:04.083 回答