2

我有 2 个如下所示的表格。

表_A

START_DT END_DT 值

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 值

1993 年 4 月 1 日 1993 年 5 月 12 日 无 1993 年 5 月 13 日 1993 年 8 月
18 日 无

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

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

表_B

START_DT END_DT 值

1993 年 4 月 1 日 1993 年 5 月 12 日 48

1993 年 5 月 13 日 1993 年 8 月 18 日 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 列。

当然有一种更简单的方法可以在不涉及游标的情况下做到这一点?

提前非常感谢。

4

1 回答 1

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
于 2013-01-18T22:30:17.257 回答