2017-06-15 112 views
2

我需要帮助更新日历表。我有2个表的一个交易表(表T)和一个日历表(表C)。我试图更新日历表中的应用程序ID(app_id)和emp_Id,一旦日期可用,如果日期重叠,则不应更新。更新运行如SQL Server重叠日期

表笔

app_id emp_id stdate  eddate  priority 
-----------------------------------------------  
1  15  2015-01-03 2015-01-05 1 
2  18  2015-01-04 2015-01-06 2 

表C

dates  app_id empid 
---------------------------- 
2015-01-03  null null 
2015-01-04  null null 
2015-01-05  null null 

后的结果应该是

表C

dates  app_id empid 
---------------------------- 
2015-01-03  1  15 
2015-01-04  1  15 
2015-01-05  1  15 
+0

假定日期表T不能重叠,这是上'简单加入C.dates> = T.stdate AND C.dates <= T.eddate' – ZLK

+0

你需要'app_id'和'emp_id'吗?他们都是桌T的PK吗?或者只是前者?我猜'2015-01-06'会有'2 18',对吗? – Andrew

+0

是的,我需要app_id和emp_id,他们是表中的pk T – user1446930

回答

0

我写了这关某个东西的上放 我的头,我希望它为你的作品:

UPDATE TC 
SET app_id = (SELECT TOP 1 app_id FROM TABLE_T TT WHERE TC.dates BETWEEN TT.stdate AND tt.eddate ORDER BY TT.priority ASC), 
empid = (SELECT TOP 1 emp_id FROM TABLE_T TT WHERE TC.dates BETWEEN TT.stdate AND tt.eddate ORDER BY TT.priority ASC) 
FROM TABLE_C TC 

可以调试此第一与此查询:

SELECT TC.*, 
new_app_id = (SELECT TOP 1 app_id FROM TABLE_T TT WHERE TC.dates BETWEEN TT.stdate AND tt.eddate ORDER BY TT.priority ASC), 
new_empid = (SELECT TOP 1 emp_id FROM TABLE_T TT WHERE TC.dates BETWEEN TT.stdate AND tt.eddate ORDER BY TT.priority ASC) 
FROM TABLE_C TC 

我用emp_idempid在你的榜样。

1

我会倾斜apply做到这一点:

update c 
    set app_id = t.app_id, 
     empid = t.empid 
    from table_c c apply 
     (select top 1 t.* 
      from table_t t 
      where tc.dates >= t.stdate and 
       tc.dates <= t.eddate 
      order by t.priority 
     ) t;