Обновление значений столбца SQL значениями из того же столбца - PullRequest
0 голосов
/ 28 февраля 2012

data

Если вы посмотрите на изображение выше. Мне нужно обновить эту таблицу для нулевых значений TID, который является третьим столбцом в таблице, со значениями между двумя строками, которые действительно имеют значение.

Таким образом, в приведенном выше примере мне нужно иметь строки 44-57 как 040, строку 60-87 как 077 и т. Д. Можно использовать один шаблон: столбец 2 содержит INS в строке, что означает, что значение в столбец 3 подлежит изменению. Так что я думал об использовании DATA LIKE 'INS%' в некотором роде.

Пожалуйста, дайте мне знать, что вы думаете о проблеме и любых возможных решениях.

спасибо!

Ответы [ 3 ]

2 голосов
/ 28 февраля 2012
DECLARE @x TABLE
(Column1 INT, Column2 VARCHAR(64), TID VARCHAR(10));

INSERT @x VALUES
(42, 'INS{whatever}', '040'),
(43, 'somethingelse', '040'),
(44, 'somethingelse', NULL),
(45, 'somethingelse', NULL),
(46, 'somethingelse', NULL),
(47, 'somethingelse', NULL),
(48, 'somethingelse', NULL),
(49, 'INS{whatever}', '077'),
(50, 'somethingelse', '077'),
(51, 'somethingelse', NULL),
(52, 'somethingelse', NULL);

;WITH x AS (SELECT i = Column1, TID, rn = ROW_NUMBER() OVER (ORDER BY Column1)
    FROM @x WHERE Column2 LIKE 'INS%'
),
y AS (SELECT x.TID, s = x.i, e = COALESCE(x2.i, 2000000000)
FROM x LEFT OUTER JOIN x AS x2 ON x.rn = x2.rn -1
)
UPDATE src SET TID = y.TID
FROM @x AS src
INNER JOIN y ON src.Column1 > y.s AND src.Column1 < y.e;

SELECT * FROM @x;
2 голосов
/ 28 февраля 2012

Предполагается, что:

  • Первые два столбца в вашем образце были дублированы (я игнорирую первый в списке)
  • Col1 является первичным ключом
  • Значениядолжны назначаться, как вы описали, на основе возрастающих значений в столбце Col1
  • Производительность может быть плохой или очень плохой для больших таблиц
  • Производительность улучшится при подходящей индексации (для Col1 и Col3)

Подставьте в таблицу и имена столбцов и проверьте наличие мелких опечаток.

UPDATE MyTable
 set Col3 = mt2.Col3
 from MyTable mt
  inner join (--  Get the "earlier" Col3 value for each row that has no value
              select t1.Col1, max(t2.Col1) EarlierValueHere
               from MyTable t1
                inner join MyTable t2
                 on t2.Col1 < t1.Col1
                  and t2.Col3 is not null
               group by t1.Col1
               where t1.Col3 is null) earlier
   on earlier.Col1 = mt.Col1
  inner join MyTable mt2
   on mt2.Col1 = earlier.EarlierValueHere
0 голосов
/ 28 февраля 2012

Другой запрос, который вы можете использовать:

update t set TID = X.NonNullTID
from [YourTable] t
join 
    (select 
        t1.Column1, t1.Column2, t1.TID, 
        (select top 1 tid from [YourTable]
            where TID is not null and Column1 <= t1.Column1 
            order by Column1 desc) as NonNullTID
    from [YourTable] t1) X
    on X.Column1 = t.Column1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...