Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态返回行数的sql查询_Sql_Sql Server - Fatal编程技术网

动态返回行数的sql查询

动态返回行数的sql查询,sql,sql-server,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

我有一张表格

 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的子集

我的问题是,我能否形成一个select查询,返回一个有N行的表 并且是copyid递增的clientid和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将始终是客户端和副本组合的倍数


我知道如何使用循环来实现这一点。但是,是否可以使用单个select查询

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

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

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 

可以在上找到一个工作示例

在最终结果中,列copy id的值应该是多少?您能解释一下导致输出中CopyID从3开始的逻辑吗?为什么第三行不是新输出的一部分,其中clientId=4,startdate=44,为什么日期=44???表中有两行clientId为4,CopyID为1,所以我希望查询增加copyid在evry两行之后,对于该客户端,其基本值应为maxcopyid+1。基本上,我希望客户端和副本的克隆与copyid的组合自动递增Hanks Gidil。我也在考虑使用CTE的递归查询,但由于我对CTE的掌握不是很好,所以我花了很长时间才想出一个解决方案。再次感谢