2016-07-26 32 views
0

我在过去问过类似的问题,并且想象已经有对此的回答,但似乎无法找出找到它的措辞。将子女日期范围与家长合并

我有一个父表的日期范围和一个子表,父表的日期范围内可以有多个日期范围的父表。我需要将它们合并为一系列中的每个记录。一个例子可以更好地解释什么,我想:

表1(父)

Date1 Date2 Person 
1/1/16 7/1/16 A 

和 表2(儿童)

Date1 Date2 Person 
2/1/16 2/4/16 B 
3/6/16 3/8/16 C 
5/4/16 5/9/16 B 

我想要一个合并表所示:

合并表

Date1 Date2 Person 
1/1/16 2/1/16 A 
2/1/16 2/4/16 B 
2/4/16 3/6/16 A 
3/6/16 3/8/16 C 
3/8/16 5/4/16 A 
5/4/16 5/9/16 B 
5/9/16 7/1/16 A 

必须有一个简单的方法来做到这一点?我对一个复杂的while循环没有问题,但是我也很难理解这一点。

+0

SQL2014。所以它应该是最新的功能/等。 – Julian

回答

1

按照要求,这是一个修改后的版本,其考虑多种PK/FK

Declare @Table1 table (PK int,Date1 Date,Date2 Date, Person varchar(25)) 
Insert into @Table1 values 
(1,'1/1/16','7/1/16','A'), 
(2,'2/1/16','8/1/16','A') 


Declare @Table2 table (FK int,Date1 Date,Date2 Date, Person varchar(25)) 
Insert into @Table2 values 
(1,'2/1/16','2/4/16','B'), 
(1,'3/6/16','3/8/16','C'), 
(1,'5/4/16','5/9/16','B'), 
(2,'3/1/16','3/4/16','B'), 
(2,'3/6/16','3/8/16','C'), 
(2,'5/4/16','5/9/16','B') 


;with cteBase as (
    Select * 
      ,Gap1 = Date2 
      ,Gap2 = Lead(Date1,1,(Select max(Date2) from @Table1 Where FK=PK)) over (Partition By FK Order by Date1) 
    From @Table2 
) 
Select PK,Date1,Date2=(Select min(Date1) from @Table2 Where FK=PK),Person From @Table1 
Union All 
Select FK,Date1,Date2,Person from cteBase 
Union All 
Select FK,Date1=Gap1,Date2=Gap2,Person=B.Person 
From cteBase A 
Join @Table1 B on FK=PK 
Where Gap1<>Gap2 
Order by PK,Date1 

返回

PK Date1  Date2  Person 
1 2016-01-01 2016-02-01 A 
1 2016-02-01 2016-02-04 B 
1 2016-02-04 2016-03-06 A 
1 2016-03-06 2016-03-08 C 
1 2016-03-08 2016-05-04 A 
1 2016-05-04 2016-05-09 B 
1 2016-05-09 2016-07-01 A 
2 2016-02-01 2016-03-01 A 
2 2016-03-01 2016-03-04 B 
2 2016-03-04 2016-03-06 A 
2 2016-03-06 2016-03-08 C 
2 2016-03-08 2016-05-04 A 
2 2016-05-04 2016-05-09 B 
2 2016-05-09 2016-08-01 A 
+0

完美,谢谢! – Julian

+0

@Julian再一次,快乐帮助,欢呼声 –

1

也许这样的事?

Declare @Table1 table (Date1 Date,Date2 Date, Person varchar(25)) 
Insert into @Table1 values 
('1/1/16','7/1/16','A') 

Declare @Table2 table (Date1 Date,Date2 Date, Person varchar(25)) 
Insert into @Table2 values 
('2/1/16','2/4/16','B'), 
('3/6/16','3/8/16','C'), 
('5/4/16','5/9/16','B') 

;with cteBase as (
    Select * 
      ,Gap1 = Date2 
      ,Gap2 = Lead(Date1,1,(Select max(Date2) from @Table1)) over (Order by Date1) 
    From @Table2 
) 
Select Date1,Date2=(Select min(Date1) from @Table2),Person From @Table1 
Union All 
Select Date1,Date2,Person from cteBase 
Union All 
Select Date1=Gap1,Date2=Gap2,Person=B.Person 
From cteBase A 
Join @Table1 B on 1=1 
Order by Date1 

返回

Date1  Date2  Person 
2016-01-01 2016-02-01 A 
2016-02-01 2016-02-04 B 
2016-02-04 2016-03-06 A 
2016-03-06 2016-03-08 C 
2016-03-08 2016-05-04 A 
2016-05-04 2016-05-09 B 
2016-05-09 2016-07-01 A 
+0

我无法自己构建,但它像一个魅力一样工作!非常感谢!!!我喜欢这个社区!我可以自己用循环来解决其余的问题,但是有没有更好,更有效的方法在table1中通过PK/FK连接table2中的多行来完成同样的过程?因此,如果Table1有两行具有唯一ID,然后Table2有5个,其中3是一行的孩子,另一行是2,那么只能合并那些匹配PK/FK的行?那有意义吗? – Julian

+0

乐于助人,无需循环。如果您发布更丰富(或扩展)的示例数据集,我可以修改我的答案 –