2013-12-02 6 views
0

Я использую SQL Server 2008 R2 и вам необходимо обновить первую строку для каждого SOrder из другой таблицы, где значение даты равно null. В приведенном ниже примере я бы оценить, насколько SOrder = 000791 и REVDE2 имеет нулевое значение, если это так, я быSQL Update Row где First Row NULL

SELECT SOrder, MyDates.NewDate FROM MyDates 

UPDATE MyTable SET DateVate = MyDates.NewDate WHERE REVDE2 IS NULL 

REVDE3 должен оставаться нулевым до MyDates.NewDate> REVDE2 DateValue

SOrder  Line FieldName  DateValue 
000791  0001 REVDEL   01/12/2013 
000791  0001 REVDE2   NULL 
000791  0001 REVDE3   NULL 
000992  0001 REVDEL   05/01/2014 
000992  0001 REVDE2   08/12/2014 
000992  0001 REVDE3   NULL 

Я не уверен, если курсор будет работать, моя единственная проблема - это скорость для запуска курсора.

+0

Нет необходимости для курсора. Я думаю, вы должны использовать CTE для идентификации 1-го Null Row и перейти оттуда. Я буду работать над решением (если кто-то другой не ударит меня;) – Shiva

ответ

0

Вот Полностью рабочий Пример кода: http://sqlfiddle.com/#!3/fd3d1/15

Вот фактический SQL код, который будет делать обновления. SQL Fiddle выше содержит Схему и вставки и обновления.

Предположение в этом коде состоит в том, что FieldValue не будет выходить за пределы REVDE9, так как если он достигнет REVDE10, то сортировка по запросу будет удалена!

;WITH CTE AS 
(
    SELECT *, 
     ROW_NUMBER() OVER (PARTITION BY SOrder ORDER BY FieldName ASC) AS rn 
    FROM MyTable 
    WHERE DateValue IS NULL 
) 
-- -- SELECT * FROM CTE 
UPDATE MyTable 
SET DateValue = md.NewDate 
FROM MyTable mt 
    INNER JOIN MyDates md ON mt.SOrder = md.SOrder 
    INNER JOIN cte c ON mt.SOrder = c.SOrder 
     AND mt.FieldName = c.FieldName 
     AND c.rn = 1; 
0
WITH t AS (
    SELECT *,ROW_NUMBER() OVER(PARTITION BY SOrder ORDER BY FieldName) AS rownum 
    FROM MyDates 
    WHERE DateValue IS NULL 
) 
UPDATE t 
SET DateValue = NewDate 
WHERE rownum = 1