根据另一个的日期范围更新表

时间:2013-01-18 22:26:26

标签: sql sql-server

我有2张表,如下所示。

TABLE_A

START_DT END_DT VALUE

4/1/1993 4/29/1993 48
4/29/1993 5/12/1993 48
5/13/1993 5/27/1993 44
5/27/1993 8/18/1993 44

表-B

START_DT END_DT VALUE

4/1/1993 5/12/1993 NULL
5/13/1993 8/18/1993 NULL

如您所见,表A的前2行日期范围属于表B的第一行日期范围。表A的行3和4的日期范围落在表B的第2行中。

根据日期范围,我想采用A.VALUE并更新B.VALUE,以便表B显示为:

表-B

START_DT END_DT VALUE

4/1/1993 5/12/1993 48

5/13/1993 8/18/1993 44

我开始尝试通过使用游标来执行此操作,并通过表A并尝试查看A.START_DT和A.END_DT是否属于表B的范围,以及 相应更新。

基本上,

DECLARE @StartDate datetime, @EndDate datetime, @Value smallint; DECLARE MyCursor cursor for select * from TABLE_A

OPEN MyCursor FETCH NEXT FROM MyCursor INTO @StartDate,@EndDate, @Value //然后我想做点什么:

//  SELECT START_DT, END_DT
//      FROM TABLE_B
//      WHERE START_DT <= A.@EndDate
//      AND END_DT>= A.@StartDate
//
//

//从这里开始,我对如何最好地更新表B中的VALUE列感到困惑。

UPDATE TABLE B
    SET VALUE = @Value

WHERE B.START_DT,B.END_DT in (
    SELECT start_dt,end_dt
        FROM TABLE_B
        WHERE start_dt <= @EndDate
        AND end_dt >= @StartDate)

上面的语法不正确,但你明白了。有没有人有快速和肮脏的方法来做/修复这个?我正在大脑冻结如何根据日期范围编写sql来选择我想要使用的行,然后更新单个VALUE列。

当然,如果不涉及游标,有一种更简单的方法吗?

非常感谢。

1 个答案:

答案 0 :(得分:2)

尝试使用以下代码更新值, 您可以完全避免光标并使用此

UPDATE B
SET B.VALUE = V.VALUE
FROM TABLE_B B 
CROSS APPLY (SELECT DISTINCT VALUE FROM TABLE_A A 
              WHERE B.start_dt <= A.End_dt AND B.end_dt >= A.Star_Dt) V