使用同一列中的值更新SQL列的值

时间:2012-02-28 18:34:19

标签: sql-server-2008

data

如果你看一下上面的图片。我需要更新此表以获取表中第三列的TID的空值,其中两行之间的值实际上具有值。

所以在上面的例子中,我需要将行44-57作为040,将行60-87作为077等。可以使用的一种模式是第2列在字符串中有INS,表示该值为第3栏将被更改。所以我在考虑以某种方式使用DATA LIKE'INS%'。

请让我知道您对问题的看法以及任何可能的解决方案。

谢谢!

3 个答案:

答案 0 :(得分:2)

这假定:

  • 示例中的前两列是重复的(我忽略了第一个列出的列)
  • 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

答案 1 :(得分:2)

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 :(得分:0)

您可能使用的另一个查询:

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
相关问题