更新前N行,其中N对于其他表中的每一行都是特定的

时间:2014-10-28 09:24:22

标签: sql sql-server tsql

我想使用自己的更新特定值执行更新某些外部表的foreach行,并强制它使用外部表中的行作为CountToUpdate更新前(n)行。

UPDATE TOP(q.CountToUpdate) dbo.TableName SET SomeId = NULL 
FROM @Quantities q 
WHERE TableName.Status = 960 AND TableName.SomeId = q.SomeId;

是否可以以这种方式更新,还是应该将其重写为其他内容?

db on sql server 2012,谢谢

2 个答案:

答案 0 :(得分:1)

我会使用row_number()join

执行此操作
UPDATE t
    SET SomeId = NULL 
FROM (SELECT t.*, ROW_NUMBER() OVER (PARTITION BY t.SomeId ORDER BY t.SomeId) as seqnum
      FROM dbo.TableName t
      WHERE t.Status = 960
     ) t JOIN
     @Quantities q 
     ON q.SomeId = ie.SomeId;

答案 1 :(得分:1)

没有订单的

TOP不确定,在使用TOP(n)时,n必须是外部参考。您可以使用CROSS APPLY执行更新,TOP允许使用UPDATE t SET SomeID = NULL FROM @Quantities AS q CROSS APPLY ( SELECT TOP (q.CountToUpdate) t.ID, t.SomeID, t.Status FROM dbo.TableName AS t WHERE t.SomeID = q.SomeID AND t.Status = 960 ORDER BY t.ID ) AS t; 和确定性订单:

DECLARE @T TABLE (ID INT IDENTITY, SomeID INT, Status INT);
DECLARE @Q TABLE (SomeID INT, CountToUpdate INT);

INSERT @T (SomeID, Status) 
VALUES 
    (1, 960), (1, 960), (1, 960), (1, 960), (1, 960),
    (2, 960), (2, 960), (2, 960), (2, 960), (2, 960),
    (3, 960), (3, 960), (3, 960), (3, 960), (3, 960);

INSERT @Q (SomeID, CountToUpdate)
VALUES (1, 4), (2, 3), (3, 2);

UPDATE  t
SET     SomeID = NULL
FROM    @q AS q
        CROSS APPLY
        (   SELECT  TOP (q.CountToUpdate) t.ID, t.SomeID, t.Status
            FROM    @T AS t
            WHERE   t.SomeID = q.SomeID
            AND     t.Status = 960
            ORDER BY t.ID
        ) AS t;

SELECT  *
FROM    @t;

完整的工作示例:

{{1}}