2016-10-17 18 views
-3

私は2つのテーブルの下になった:私は以下のように最初のテーブルを更新したいSQL Serverの日付に基づいてテーブルを更新しますか?

if object_id('tempdb..#t1') is not null 
    drop table #t1 

create table #t1 
(
    ID int, 
    opendate datetime, 
    closedate datetime, 
    [ADDRESS] varchar(50) 
) 

insert into #t1 (ID, opendate, closedate) 
values (111, '1930-05-01 00:00:00.000', '2004-10-23 00:00:00.000'), 
     (111, '2004-10-23 00:00:00.000', '2006-03-26 00:00:00.000'), 
     (111, '2006-10-23 00:00:00.000', '2009-03-26 00:00:00.000'), 
     (111, '2009-03-26 00:00:00.000', '2013-05-21 00:00:00.000'), 
     (111, '2013-05-21 00:00:00.000', '2013-06-18 00:00:00.000'), 
     (111, '2013-06-18 00:00:00.000', '2016-04-11 00:00:00.000'), 
     (111, '2016-04-11 00:00:00.000', '2016-06-16 00:00:00.000'), 
     (111, '2016-06-16 00:00:00.000', '2016-06-21 00:00:00.000'), 
     (111, '2016-06-21 00:00:00.000', NULL) 

select 
    * 
from 
    #t1 

if object_id('tempdb..#t2') is not null 
    drop table #t2 

create table #t2 
(
    ID int, 
    opendate datetime, 
    closedate datetime, 
    [ADDRESS] varchar(50) 
) 

insert into #t2 (ID, opendate, closedate, [ADDRESS]) 
values 
(111,'1930-05-01 00:00:00.000','2004-10-23 00:00:00.000','1 AVENUE' ) 
,(111,'2004-10-23 00:00:00.000','2009-03-26 00:00:00.000','2 AVENUE' ) 
,(111,'2009-03-26 00:00:00.000','2013-05-21 00:00:00.000','3 AVENUE' ) 
,(111,'2013-05-21 00:00:00.000' ,NULL      ,'5 AVENUE') 
,(111,'2016-04-11 00:00:00.000' ,'2016-06-16 00:00:00.000','6 AVENUE' ) 
,(111,'2016-06-16 00:00:00.000' ,NULL      ,'7 AVENUE' ) 
,(111,'2016-06-21 00:00:00.000' ,NULL      ,'8 AVENUE' ) 


select 
    * 
from 
    #t2 

111 1930-05-01 00:00:00.000 2004-10-23 00:00:00.000 '1 AVENUE' 
111 2004-10-23 00:00:00.000 2006-03-26 00:00:00.000 '2 AVENUE' 
111 2006-03-26 00:00:00.000 2009-03-26 00:00:00.000 '2 AVENUE' 
111 2009-03-26 00:00:00.000 2013-05-21 00:00:00.000 '3 AVENUE' 
111 2013-05-21 00:00:00.000 2013-06-18 00:00:00.000 '5 AVENUE' 
111 2013-06-18 00:00:00.000 2016-04-11 00:00:00.000 '5 AVENUE' 
111 2016-04-11 00:00:00.000 2016-06-16 00:00:00.000 '6 AVENUE' 
111 2016-06-16 00:00:00.000 2016-06-21 00:00:00.000 '7 AVENUE' 
111 2016-06-21 00:00:00.000 NULL     '8 AVENUE'   

私はいくつかの方法を試してみましたが、それはNULLのため、正しい結果を返すされていません。

ありがとうございました。

+0

達成したいことは明確ではありません。 –

+0

#t1テーブルを更新したい#t2テーブルIDとオープン日時と終了日時に基づくアドレスフィールド。 – user3583912

+0

私はこのように説明しましょう。もし#t1が#t2のオープン日とクローズ日付の間にあるならば、それはアドレスフィールドを更新するはずです。ありがとう。 – user3583912

答えて

2
update t1 set address = tmp.address 
from (select t1.ID, t1.opendate, ROW_NUMBER() over (partition by t1.opendate order by t2.opendate desc) row, t2.ADDRESS 
    from #t1 t1 
    inner join #t2 t2 on t1.ID = t2.ID and t1.opendate between t2.opendate and isnull(t2.closedate, t1.opendate)) tmp 
inner join #t1 t1 on t1.ID = tmp.ID and t1.opendate = tmp.opendate and tmp.row = 1 
+0

ありがとう@ViktorČajbík、それは正常に動作しています。あなたは素晴らしい人です。 – user3583912

関連する問題