在SQL Server中创建包含多个表的时间轴

时间:2016-03-22 14:46:50

标签: sql sql-server timeline temporal-database

我有以下3个表格:

CREATE TABLE Jedi  (
jediId INT NOT null,
name nvarchar(100) NOT NULL,
jediRank nvarchar(100) NOT NULL,
fromDate Date NOT NULL,
toDate Date NOT NULL
)

INSERT INTO Jedi(jediId, name, jediRank, fromdate, todate)
SELECT 666 jediId, 'A.Skywalker' name, 'padawan' jediRank, '1990-01-01' fromDate, '1999-12-31' toDate Union
SELECT 666 jediId, 'A.Skywalker' name, 'Jedi Knight' jediRank, '2000-01-01' fromDate, '2005-06-17' toDate Union
SELECT 666 jediId, 'A.Skywalker' name, 'Jedi Master' jediRank, '2005-06-18' fromDate, '2005-09-28' toDate Union
SELECT 666 jediId, 'D.Vader' name, 'Sith Apprentice' jediRank, '2005-09-29' fromDate, '9999-12-31' toDate  
ORDER BY jediId, fromdate, todate

CREATE TABLE lightsaberColors (
jediId int, 
lightsaberColor nvarchar(100) NOT NULL,
fromDate Date NOT NULL,
toDate Date NOT NULL
)

INSERT INTO lightsaberColors(jediId, lightsaberColor, fromdate, todate)
SELECT 666, 'blue' color, '1990-01-01' fromdate, '1992-01-01' todate UNION
SELECT 666, 'green' color, '1992-01-02' fromdate, '1992-04-15' todate UNION
SELECT 666, 'blue' color, '1992-04-16' fromdate, '2005-09-30' todate UNION
SELECT 666, 'red' color, '2005-10-01' fromdate, '9999-12-31' todate
ORDER BY fromdate, todate

CREATE TABLE mechanicalbodyparts (
jediId int, 
mechanicalBodyPart nvarchar(100) NOT NULL,
fromDate Date NOT NULL,
toDate Date NOT NULL
)
INSERT INTO mechanicalbodyparts(jediId, mechanicalBodyPart,fromDate, toDate)
SELECT 666, 'N/A' mechanicalBodyPart, '1990-01-01' fromdate, '1998-05-13' todate UNION
SELECT 666, 'hand and arm' mechanicalBodyPart, '1998-05-14' fromdate, '2005-09-29' todate UNION
SELECT 666, 'pretty much everything' mechanicalBodyPart, '2005-09-30' fromdate, '9999-12-31' todate
ORDER BY fromdate, todate

 SELECT * From jedi ORDER BY fromdate
 SELECT * From lightsaberColors ORDER BY fromdate
 SELECT * From mechanicalbodyparts ORDER BY fromdate

我想要找到的是将所有这些数据组合成单个表的最佳方式,该表基本上是每个jedi的时间线。

在这种情况下我最终会得到的表是:

CREATE TABLE JediTimeline(
jediId Int NOT null,
fromDate date NOT null,
toDate date NOT NULL,
name nvarchar(100) NOT NULL,
jediRank nvarchar(100) NOT NULL, 
mechanicalBodyPart nvarchar(100) NOT NULL,
lightsaberColor nvarchar(100) NOT NULL
)

INSERT INTO JediTimeline (jediId, fromDate, toDate, name, jediRank, mechanicalBodyPart, lightsaberColor)
Select 666, '1990-01-01', '1992-01-01', 'A.Skywalker', 'padawan', 'N/A', 'blue' Union
Select 666, '1992-01-02', '1992-04-15', 'A.Skywalker', 'padawan', 'N/A', 'green' Union
Select 666, '1992-04-16', '1998-05-13', 'A.Skywalker', 'padawan', 'N/A', 'blue' Union
Select 666, '1998-05-14', '1999-12-31', 'A.Skywalker', 'padawan', 'hand and arm', 'blue' Union
Select 666, '2000-01-01', '2005-06-17', 'A.Skywalker', 'Jedi Knight', 'hand and arm', 'blue' Union
Select 666, '2005-06-18', '2005-09-28', 'A.Skywalker', 'Jedi Master', 'hand and arm', 'blue' Union
Select 666, '2005-09-29', '2005-09-29', 'D.Vader', 'Sith Apprentice', 'hand and arm', 'blue' Union
Select 666, '2005-09-30', '2005-09-30', 'D.Vader', 'Sith Apprentice', 'pretty much everything', 'blue' Union
Select 666, '2005-10-01', '9999-12-31', 'D.Vader', 'Sith Apprentice', 'pretty much everything', 'red'  
ORDER BY 1,2,3


SELECT *
FROM JediTimeline

现在,我已经为此提出了一个解决方案,但它使用了一个在这种情况下工作正常的游标,但是当我使用的数据明显更大时,它并不理想。

我正在使用SQL Server 2012.

另一方面,这是“群岛”问题的一个例子吗?

1 个答案:

答案 0 :(得分:1)

如果您运行<system.net> <settings> <httpWebRequest useUnsafeHeaderParsing="true" /> </settings> </system.net> DATEADD计划,而不是>=<(来自fromDate和toDate),则可以避免所有>=

<=