我需要更新表中的记录,其日期字段的值小于表中共享另一个字段的相同值的所有记录的最大日期值减go 天数.

从下面的列表中,如果记录的Header_BusDate小于表中具有相同Header_SiteKey字段值的所有记录的最大日期值(减go 天数),则将Header_Ready字段设置为1.

我需要在不使用游标的情况下完成这项工作(我已经有游标了,但我的雇主对游标过敏).

CREATE TABLE #Headers
(
    Header_Key      decimal(15,0)   NOT NULL,
    Header_SiteKey  decimal(15,0)   NOT NULL,
    Header_BusDate  smalldatetime   NOT NULL,
    Header_Ready    bit             NOT NULL default(0)
)

INSERT INTO #Headers
VALUES
(610, 4, '2023-04-16', 0),
(609, 4, '2023-04-15', 0),
(608, 4, '2023-04-14', 0),
(607, 4, '2023-04-13', 0),
(606, 4, '2023-04-12', 0),
(605, 4, '2023-04-11', 0),
(604, 4, '2023-04-10', 0),
(617, 6, '2032-12-31', 0),
(616, 6, '2023-04-15', 0),
(615, 6, '2023-04-14', 0),
(614, 6, '2023-04-13', 0),
(613, 6, '2023-04-12', 0),
(612, 6, '2023-04-11', 0),
(611, 6, '2023-04-10', 0)

/* This doesn't work */
UPDATE #Headers
   SET Header_Ready = 1
 WHERE Header_BusDate < 
       (SELECT MAX(Header_BusDate) - 2 day
          FROM #Headers hdrs 
         WHERE hdrs.Header_SiteKey = Header_SiteKey)

SELECT * FROM #Headers

DROP TABLE #Headers

以下是我想要的结果(从我的游标解决方案输出):

Header_Key  Header_SiteKey  Header_BusDate      Header_Ready
610         4               2023-04-16 00:00:00            0
609         4               2023-04-15 00:00:00            0
608         4               2023-04-14 00:00:00            0
607         4               2023-04-13 00:00:00            1
606         4               2023-04-12 00:00:00            1
605         4               2023-04-11 00:00:00            1
604         4               2023-04-10 00:00:00            1
617         6               2032-12-31 00:00:00            0
616         6               2023-04-15 00:00:00            1
615         6               2023-04-14 00:00:00            1
614         6               2023-04-13 00:00:00            1
613         6               2023-04-12 00:00:00            1
612         6               2023-04-11 00:00:00            1
611         6               2023-04-10 00:00:00            1

提前感谢您的帮助!

推荐答案

WHERE hdrs.Header_SiteKey = Header_SiteKey更改为WHERE hdrs.Header_SiteKey = #Headers.Header_SiteKey

SQL Server假定您指的是HDRS表中的HEADER_SiteKey,这意味着您正在更新每一行:

UPDATE #Headers
SET Header_Ready = 1
WHERE Header_BusDate < 
   (SELECT MAX(Header_BusDate) - 2 day
     FROM #Headers hdrs 
     WHERE hdrs.Header_SiteKey = #Headers.Header_SiteKey)

Sql相关问答推荐

跨多列的PostgreSQL非不同对

获取每5分钟时间间隔的总和

前面的语句不喜欢AND LIKE?当try 更新使用ID和日期过滤的表时

PostgreSQL基于2个COLS的任意组合 Select 唯一行

为什么TRY_CONVERT返回一个XML验证错误而不是NULL?

明细表中没有记录如何更新主表的值为0

如何用HeidiSQL在Firebird中设置超时?

如何使用聚合连接两个表

如何在 golang squirrel lib 中添加 postgreSQL 的distinct on

从每月生成的系列中生成每日汇率

从输出中删除 jsonb_build_object

将时间戳四舍五入到最近 10 分钟的查询

如何计算两个非周期性时间序列+分组的重叠持续时间

什么是 100.它与 100 有什么区别?

基于字符串的SQL查询

自动生成计算频率的列

for each 客户查找每个类别的最新评分

函数调用作为插入值语句中的参数

在 SQL 的每行选项中 Select 最大值

SQL:有没有办法根据另一列的数据细节过滤和形成另一列?