我有一张表格
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将始终是客户端和副本组合的倍数
我知道如何使用循环来做到这一点。但是可以使用单个选择查询吗?
答案 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找到一个工作示例。