SQL Server重叠日期
我需要更新日历表的帮助。我有两个表,一个是事务表T,一个是日历表C。一旦日期可用,我将尝试使用应用程序id app_id和emp_id更新日历表,如果日期重叠,则不应更新。e、 gSQL Server重叠日期,sql,sql-server,date,overlapping,Sql,Sql Server,Date,Overlapping,我需要更新日历表的帮助。我有两个表,一个是事务表T,一个是日历表C。一旦日期可用,我将尝试使用应用程序id app_id和emp_id更新日历表,如果日期重叠,则不应更新。e、 g app_id emp_id stdate eddate priority ----------------------------------------------- 1 15 2015-01-03 2015-01-05 1 2 18
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
表T
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
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
dates app_id empid
----------------------------
2015-01-03 null null
2015-01-04 null null
2015-01-05 null null
dates app_id empid
----------------------------
2015-01-03 1 15
2015-01-04 1 15
2015-01-05 1 15
运行更新后,结果应为
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
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
dates app_id empid
----------------------------
2015-01-03 null null
2015-01-04 null null
2015-01-05 null null
dates app_id empid
----------------------------
2015-01-03 1 15
2015-01-04 1 15
2015-01-05 1 15
我在脑海中写下了这句话,我希望它对你有用:
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
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
您可以首先使用此查询调试此问题:
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
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_id和empid。我倾向于使用apply:
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
假设表T中的日期不能重叠,这是C.dates>=T.stdate和C.dates上的简单联接。您需要应用程序id和emp\U id吗?它们都是表T的PK吗?还是仅仅是前者?我猜2015-01-06将有2个18,对吗?是的,我需要应用程序id和emp_id,它们在表TDid中是pk。有任何答案适合你吗?