Question:
Does anyone know if it is possible to use CTE to recursively return the set of record(s) NOT in the recursive CTE?
Background:
The versioning strategy is to have an initial set of records represent version #1. When a change is made to any of the records in version #1, a new version will be created by querying ONLY the modified records from version #1 and re-inserting them as version #2, thereby making this new version related to the old.
Criteria:
* there can be multilpe versions
* a version can "inherit" records from other versions
Heres a sample concept:
DECLARE @newVersionNumber DECIMAL(2,1)
DECLARE @baseVersionID INT
DECLARE @newVersionID INT
DECLARE @table TABLE (
TableID INT IDENTITY(1,1)
,[Name] VARCHAR(10)
,[Value] DECIMAL(18,2)
,VersionID INT)
DECLARE @version TABLE (
VersionID INT IDENTITY(1,1)
,VersionNumber DECIMAL(2, 1)
,ParentVersionID INT)
-- VERSION # 1: Initial state of the data with default version
SET @baseVersionID = 1
INSERT @version VALUES (1.0, Null)
INSERT @table ([Name], [Value], VersionID) VALUES ('A', 100, @baseVersionID) -- never change in all version
INSERT @table ([Name], [Value], VersionID) VALUES ('B', 200, @baseVersionID) -- changed in every version
INSERT @table ([Name], [Value], VersionID) VALUES ('C', 300, @baseVersionID); -- changed in every other version
-- VERSION # 2: Simulate a versioning of the data based on default version
SET @baseVersionID = 1
SELECT @newVersionNumber = IsNull(VersionNumber, 0) + 1 FROM @version WHERE VersionID = @baseVersionID
INSERT @version VALUES (@newVersionNumber, @baseVersionID)
SET @newVersionID = SCOPE_IDENTITY()
INSERT @table([Name], [Value], VersionID)
(
SELECT DISTINCT [Name], 400, @newVersionID FROM @table WHERE [Name] = 'B'
);
-- VERSION # 3: Simulate a versioning of the data
SET @baseVersionID = 2
SELECT @newVersionNumber = IsNull(VersionNumber, 0) + 1 FROM @version WHERE VersionID = @baseVersionID
INSERT @version VALUES (@newVersionNumber, @baseVersionID)
SET @newVersionID = SCOPE_IDENTITY()
INSERT @table([Name], [Value], VersionID)
(
SELECT DISTINCT [Name], 800, @newVersionID FROM @table WHERE [Name] = 'B'
UNION
SELECT DISTINCT [Name], 900, @newVersionID FROM @table WHERE [Name] = 'C'
);
-- VERSION # 4: Simulate a versioning of the data
SET @baseVersionID = 2
SELECT @newVersionNumber = IsNull(VersionNumber, 0) + 1 FROM @version WHERE VersionID = @baseVersionID
INSERT @version VALUES (@newVersionNumber, @baseVersionID)
SET @newVersionID = SCOPE_IDENTITY()
INSERT @table([Name], [Value], VersionID)
(
SELECT DISTINCT [Name], 200, @newVersionID FROM @table WHERE [Name] = 'A'
UNION
SELECT DISTINCT [Name], 1600, @newVersionID FROM @table WHERE [Name] = 'B'
UNION
SELECT DISTINCT [Name], 1800, @newVersionID FROM @table WHERE [Name] = 'C'
);
-- VERSION # 5: Simulate a versioning of the data
SET @baseVersionID = 2
SELECT @newVersionNumber = IsNull(VersionNumber, 0) + 1 FROM @version WHERE VersionID = @baseVersionID
INSERT @version VALUES (@newVersionNumber, @baseVersionID)
SET @newVersionID = SCOPE_IDENTITY()
INSERT @table([Name], [Value], VersionID)
(
SELECT DISTINCT [Name], 3600, @newVersionID FROM @table WHERE [Name] = 'C'
);