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

标签 sql sql-server

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

表_A

START_DT     END_DT     VALUE

1993年4月1日       1993年4月29日       48
1993年4月29日      1993年5月12日      48
1993年5月13日      1993年5月27日      44
1993年5月27日      1993年8月18日      44

TABLE_B

START_DT END_DT VALUE

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

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

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

TABLE_B

START_DT END_DT VALUE

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

1993年5月13日      1993年8月18日      44

我开始尝试使用游标来执行此操作,遍历表 A 并尝试查看 A.START_DT 和 A.END_DT 是否落入表 B 的范围内,并且 相应更新。

基本上,

声明 @StartDate 日期时间、@EndDate 日期时间、@Valuesmallint; 声明 MyCursor 光标 从 TABLE_A 中选择 *

打开我的光标 从 MyCursor 获取下一个内容到 @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 列。

肯定有一种更简单的方法可以在不涉及游标的情况下完成此操作吗?

提前致谢。

最佳答案

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

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

关于sql - 根据另一个表的日期范围更新一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14408680/

相关文章:

sql - 除了连接 3 个或更多表之外,还有其他选择吗?

sql - 如何在 PL/SQL 中将引用游标中的数据批量插入到临时表中

sql-server - 将计算列转换为常规列

MySQL Workbench - 数据库迁移(SQL Server -> MySQL)

c# - 在 LINQ 中对多个表进行分组

sql - 如果剧集直接连续或重叠,则合并日期行

java - 奇怪的 Java SQL 时间戳日历检索行为 - 从日历中获取毫秒?

java - Spring 中的事务原子性

sql-server - 什么是 SQL Server 版本 8?

sql-server - 添加链接的 SQL 服务器时遇到问题