2014-11-05 7 views
0

У меня есть запрос, где я хочу выбрать запись и запись, которая будет до и после нее на основе идентификатора. Для всех записей NULL для FirstName я хочу установить FirstName как предыдущую запись. У меня есть код, который успешно получает таблицу значений до и после, но как я могу обновить значение? Я пробовал код ниже, но у меня есть ошибка, подобная этомуУстановка значения столбца в значение предыдущих записей

Кто-нибудь знает, в чем проблема? Обратите внимание, что я использую SQL Server 2008, так что я не могу использовать LAG или LEAD

WITH CTE AS (
    SELECT 
    rownum = ROW_NUMBER() OVER (ORDER BY p.BusinessEntityID), 
    p.FirstName 
    FROM Person.Person p 
    ) 
    SELECT 
    prev.FirstName PreviousValue, 
    CTE.FirstName, 
    nex.FirstName NextValue 
    FROM CTE 
    LEFT JOIN CTE prev ON prev.rownum = CTE.rownum - 1 
    LEFT JOIN CTE nex ON nex.rownum = CTE.rownum + 1 
    IF(CTE.FirstName IS NULL) 
     BEGIN 
      UPDATE Person SET FirstName = prev.FirstName 
     END 
+0

Вы работаете с SQL Server 1012 или выше? Если да, проверьте новые функции LEAD и LAG. – Scoregraphic

+0

Я использую SQL Server 2008, поэтому я не могу использовать LEAD или LAG – MattTheHack

+0

@Scoregraphic 2008 указан в вопросе. –

ответ

2

Вы можете обновить cte, так что-то вроде этого следует сделать это:

WITH CTE AS (
      SELECT 
        rownum = ROW_NUMBER() OVER (ORDER BY p.BusinessEntityID), 
        p.FirstName 
      FROM Person.Person p 
      ) 
UPDATE a 
SET a.Firstname = prev.Firstname 
FROM CTE a 
JOIN CTE prev ON prev.rownum = a.rownum - 1 
WHERE a.FirstName IS NULL 
+0

Это фантастика - приветствия! также, как бы я обновил второе значение? Могу ли я добавить второе сообщение для обновления первым? – MattTheHack

+0

Вы можете 'SET' любое количество полей:' SET a.FirstName = prev.Firstname, a.othercol = prev.othercol' и т. Д. –

+0

На самом деле, мои два обновления используют отдельные предложения WHERE - возможно ли включить два обновления с разными ГДЕ? – MattTheHack

1

Ваше обновление отдельное заявление от select. Если вы хотите сделать это в обновлении, попробуйте:

WITH CTE AS (
    SELECT rownum = ROW_NUMBER() OVER (ORDER BY p.BusinessEntityID), 
      p.FirstName 
    FROM Person.Person p 
) 
UPDATE p 
    SET FirstName = prev.FirstName 
    FROM CTE p JOIN 
     CTE prev 
     ON prev.rownum = CTE.rownum - 1 
    WHERE CTE.FirstName IS NULL; 

left join здесь не важно, потому что вы только изменение строки, где FirstName IS NULL. Значение left join установило бы значение NULL.