我有一个包含以下结构的表:
|-----------|------------|-----------|
| Number | Date | Subject |
|-----------|------------|-----------|
| 1 | 2015-01-01 | ABC |
| 2 | 2015-01-01 | ABC |
| 3 | 2015-01-01 | ABC |
| 4 | 2015-01-01 | ABC |
|-----------|------------|-----------|
我需要遍历表格,并在每个日期增加 n 天。 所以,假设 n = 10 我应该得到这个结果:
|-----------|------------|-----------|
| Number | Date | Subject |
|-----------|------------|-----------|
| 1 | 2015-01-01 | ABC |
| 2 | 2015-01-11 | ABC |
| 3 | 2015-01-21 | ABC |
| 4 | 2015-01-31 | ABC |
|-----------|------------|-----------|
问题有点复杂,因为 n 是通过使用需要上一个生成日期的函数生成的 我正在尝试使用CTE来完成以下CTE,但是我获得的行数比预期的要多。
WITH myCte(Number, Date, Subject)
AS
(
SELECT * FROM MyTable
UNION ALL
SELECT
Number, dbo.get_next_date(Date)
FROM MyCte
)
SELECT * FROM MyCte
答案 0 :(得分:1)
这是因为递归CTE中没有WHERE
子句。这将导致查询在达到MAXRECURSION
值时停止(默认为100)。
以下是使用WHERE
子句
DECLARE @MyTable TABLE
(
Number int,
Dt Date,
Sub CHAR(3)
)
INSERT INTO @MyTable
VALUES
(1,'2015-01-01','ABC'),
(2,'2015-01-11','ABC'),
(3,'2015-01-21','ABC'),
(4,'2015-01-31','ABC')
;WITH myCte(Number, Date, Subject)
AS
(
SELECT * FROM @MyTable
UNION ALL
SELECT
Number, DATEADD(day, 10, Date),Subject
FROM MyCte
WHERE Date < GETDATE()
)
SELECT * FROM MyCte
编辑 - 如果您知道行数,那么您可以使用TOP
并获取这些行。
SELECT TOP 4 * FROM MyCte