2

我一直在尝试搜索此内容,但不确定我是否使用了正确的术语。或者它可能只是它是不可能的。但我想要做的是更新表中构成总和值小于设定值的所有记录。

所以这里有一个例子:

ID   type    amount   received_date    processed_date
1    debit   10       7/1/2010         NULL
2    debit   10       7/2/2010         NULL
3    debit   10       7/3/2010         NULL

现在我想要做的是更新所有等于总和小于 22 的记录。所以当我做总和时,id 1 和 2 将等于 20,小于 22。但它也只需要记录处理日期为空。我也希望它能够工作,以便它从最旧更新到最新。

基本上这是我用伪代码编写它的方式:

UPDATE credits
SET date_processed = '8/1/2010'
WHERE SUM(amount) <= @total AND
    credit_type = [debits]

但我知道这是行不通的。所以我希望一些SQL大师可能有想法。

我确信我可以在光标内写这个,但我想知道是否有基于集合的方法来执行这个。

编辑:我更新了下面的表格和简要说明,以更好地描述我的情况。

4

2 回答 2

2

SQL 表中的行表示项目的无序列表。因此,我们必须提供订单。在您的示例中,您暗示它应该处理按 Id 排序的行。

Update TableName
Set processed_date = '2010-08-01'
Where [type] = 'debit'
    And Exists      (
                    Select 1
                    From TableName As C1
                    Where C1.Id <= TableName.Id
                        And C1.[type] = 'debit'
                    Having Sum(C1.amount) <= @total
                    )

正如我在评论中提到的,依赖 Id 作为序列的标记是不安全的。可能会有间隙,并且有人使用 IDENTITY_INSERT 将“稍后”的行插入到这些间隙中。相反,您应该使用日期时间列。如果该列是,则只需在上述查询中received_date替换Id为。received_date

于 2010-07-08T19:36:00.887 回答
1

对于这种情况,您应该使用 HAVING 子句。

根据 w3schools 的说法,“HAVING 子句被添加到 SQL 中,因为 WHERE 关键字不能与聚合函数一起使用。”

UPDATE credits
SET date_processed = '8/1/2010'
WHERE credit_type = [debits]
HAVING SUM(amount) <= @total 

这是在 w3schools 上找到的一个很棒的教程

http://www.w3schools.com/SQL/sql_have.asp

于 2010-07-08T19:12:02.363 回答