Как рекурсивно обновить группы в SQL Server - PullRequest
0 голосов
/ 11 января 2010

Я использую SQL Server 2008.

следующий dataPool:

PK  Col1        Col2
1   SomeValue1  DataToTake1
2   SomeValue1
3   SomeValue1
4   SomeValue1
5   SomeValue2  DataToTake2
6   SomeValue2
...

я хочу вставить DataToTake1 в Col2 записей с PK 2, 3 и 4 и DataToTake2 в Col2 записи с PK 6.
чтобы сделать это более очевидным: записи с PK 1-4 являются группами, обозначенными Col1
другая информация: PK не может быть инкрементным или упорядоченным в производительной системе (но, поскольку мы можем сгруппировать по Col1, я надеюсь, что это не может быть проблемой).

Есть ли способ сделать это с SQL Server? (компаньон реализовал это с помощью указателя ... arggggh)

редактировать
спасибо за ваши ответы, но я должен пересмотреть свой запрос, так как моя первоначальная ситуация изменилась: мне нужно принять во внимание PK. например.

PK  Col1        Col2
1   SomeValue1  DataToTake1
2   SomeValue1
4   SomeValue1
5   SomeValue2  DataToTake2
6   SomeValue2
9   SomeValue1

как обновить только последовательные строки? в этом примере PK 1 = 2 = 4

Ответы [ 3 ]

2 голосов
/ 11 января 2010
UPDATE
   D1
SET
   Col2 = D2.Col1
FROM
   dataPool D1
   JOIN
   dataPool D2 ON D1.col1 = D2.col1
WHERE
   D1.col2 <> D2.col2 OR D1.col2 IS NULL
1 голос
/ 12 января 2010

Я думаю, вам придется использовать временные таблицы:

создать таблицу #DataToTake ( seq int не нулевое тождество (1, 1), PK_S int не null, - установите для него тот же тип, что и для PK в dataPool PK_E int null, - установите для него тот же тип, что и для PK в dataPool Col1 varchar (20) null, - установите для него тот же тип, что и для Col1 в dataPool Col2 varchar (20) null - установите для него тот же тип, что и для Col2 в dataPool )

вставить в #DataToTake (PK_S, Col1, Col2) выберите PK, Col1, Col2 из dataPool где Col2 не является нулевым заказ по PK

обновление #DataToTake set PK_E = dtt2.PK_S из #DataToTake внутреннего соединения #DataToTake dtt2 on # DataToTake.seq = dtt2.seq - 1

обновление #DataToTake set PK_E = (выберите Max (PK) + 1 из dataPool) где PK_S = (выберите Max (PK_S) из #DataToTake)

обновить набор dataPool Col2 = dtt.Col2 из dataPool внутреннее соединение #DataToTake dtt on dataPool.PK> dtt.PK_S и dataPool.PK

Удалить таблицу # DataToTake

1 голос
/ 11 января 2010
-- Select the top 1 value which has data, and matches whats in Col1
UPDATE dataPool
SET Col2 = (SELECT TOP 1 t3.Col2 
            FROM dataPool t3 
            WHERE t3.col1 = t2.col1 
            AND t3.Col2 IS NOT NULL) -- 
FROM dataPool t2
WHERE t2.Col1 = Col1
AND col2 IS NULL -- Only update Rows with NULLs in
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...