它的要点是使用WITH语句创建所有记录并使用它们插入到最终表中。
;WITH q AS (
SELECT Year = BeginYear
, Name
FROM Employees
UNION ALL
SELECT q.Year + 1
, q.Name
FROM q
INNER JOIN Employees e ON e.Name = q.Name
AND e.EndYear > q.Year
)
INSERT INTO EmployeeYears
SELECT * FROM q
OPTION(MAXRECURSION 0)
TESTDATA
CREATE TABLE Employees (BeginYear INTEGER, EndYear INTEGER, Name VARCHAR(32))
CREATE TABLE EmployeeYears (Year INTEGER, Name VARCHAR(32))
INSERT INTO Employees
SELECT 1974, 1976, 'Robert'
UNION ALL SELECT 1972, 1975, 'Lieven'
结果
SELECT *
FROM EmployeeYears
ORDER BY Name, Year
1972 Lieven
1973 Lieven
1974 Lieven
1975 Lieven
1974 Robert
1975 Robert
1976 Robert
然而,这只会得到明年吗?如果有多年呢? – William 2011-04-13 19:14:51
@William,我刚刚使用SSMS和afaik检查了它,它可以满足您的需求。 – 2011-04-13 19:18:43
这是因为递归,但您很可能会很快达到递归限制。 – 2011-04-13 19:19:29