2014-10-28 4 views
0

Я хотел бы выполнить обновление строки foreach некоторой внешней таблицы со своими собственными значениями для обновления и заставить ее обновлять строки (n) с помощью строки из внешней таблицы как CountToUpdate.Обновить верхние N строк с N для каждой строки из другой таблицы

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

Можно ли обновить таким образом или переписать его на что-то другое?

дб на SQL Server 2012, Спасибо

ответ

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

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; 
Смежные вопросы