今天是个好日子。我想问一个关于我的SQL语句的问题。我正在使用SQL Server 2008,并且有一个名为“工作流事务”的表。在此表中,我有12条记录。下图是表格的内容。

我有以下SQL语句:

UPDATE Workflow_Txn
SET Status = 1
WHERE [RequestId] IN
(
    SELECT [RequestId]
    FROM Workflow_Txn
    WHERE [OrderNumber] < (SELECT MAX(OrderNumber) FROM Workflow_Txn WHERE RequestId = 3)
    AND RequestId = 3
)

我的目标是更新一个OrderID小于最大数量的请求ID,该ID将是WHERE子句中SELECT语句的输出。现在,我希望要更新的记录应仅为上述记录(在代码中为RequestId#3)。

实际发生的是,不仅更新了四个记录,它还变成了五(5)个!我现有的SQL语句有问题吗?

最佳答案

您的问题是您正在使用RequestId = 3更新所有记录。请考虑到您的子查询结果是3,因此最终更新了所有相关记录。

您的查询相当于

UPDATE Workflow_Txn
SET Status = 1
WHERE RequestId = 3

不知道您是否有任何理由使查询变得比所需的复杂。在我看来,更简单的方法可以解决问题
UPDATE Workflow_Txn
SET    Status = 1
WHERE  [OrderNumber] < (SELECT MAX(OrderNumber) FROM Workflow_Txn WHERE RequestId = 3)
       AND RequestId = 3

关于sql - 使用子查询进行更新-更新的次数超过所需的记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17811328/

10-11 19:08
查看更多