2012-02-28 88 views
-1

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

如果您要查看上面的圖像,我需要更新此表中TID的空值,該值是表中第三列的值,其中兩行之間的值實際上具有值。

所以在上面的例子中,我需要將行44-57設置爲040,將行60-87設置爲077等。可以使用的一種模式是列2在字符串中具有INS,這表示值在第3列中將被改變。所以我正在考慮以某種方式使用DATA LIKE'INS%'。

請讓我知道你對這個問題和任何可能的解決方案的看法。

謝謝!

+0

可能重複[SQL複雜的邏輯(http://stackoverflow.com/questions/9473835/sql-complex-logic) – 2012-02-28 23:24:26

回答

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; 
+0

它的工作原理。該死的!你們好棒。太神奇了...... – OBL 2012-02-28 19:21:26

+0

請你解釋一下邏輯。我正在嘗試爲另一個問題做類似的事情。 謝謝! – OBL 2012-02-29 19:33:42

+0

第一個cte(x)取值爲Column2 ='INS ',第二個cte(y)做一個自連接,因此它可以確定哪些行位於第一行後面。合併在那裏,因爲在表中的「最後一行」之後永遠不會有*行 - 我認爲你的表不會有20億個ID。然後它爲所有後續行應用原始TID值,該值大於該TID的「第一」行並小於第一個「不同」TID的第一行。 – 2012-02-29 19:41:22

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 
+0

嘗試這些。該死的!你們好棒。太神奇了...... – OBL 2012-02-28 19:07:38

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 
相關問題