2017-01-02 57 views
0

我需要使用基於ID & DATE列的最後一個已知值中的新值更新NULL值。請注意,只要ID列正在更改,非空值更新應該會更改。與SQL Server中其他表中的屬性相關的屬性

下面的例子查詢,Null由5 L2取代& 2016年1月12日行,但作爲ID被改變爲L2和5從L1行把它應爲空。但每當ID正在改變時,我需要獲得R_ID

我的表有9000萬行,更新過程應儘可能快。

CREATE TABLE #temp 
(
    ID nvarchar(10), 
    DATE date, 
    R_ID INT 
); 

INSERT INTO #temp 
    SELECT 'L1', '2016-12-01', NULL 
    UNION ALL 
    SELECT 'L1', '2016-12-02', 5 
    UNION ALL 
    SELECT 'L1', '2016-12-03', NULL 
    UNION ALL 
    SELECT 'L2', '2016-12-01', NULL 
    UNION ALL 
    SELECT 'L2', '2016-12-02', 8 
    UNION ALL 
    SELECT 'L2', '2016-12-03', NULL 
    UNION ALL 
    SELECT 'L3', '2016-12-03', 3 
    UNION ALL 
    SELECT 'L3', '2016-12-04', NULL 
    UNION ALL 
    SELECT 'L3', '2016-12-04', NULL ; 

DECLARE @R_ID INT; 

UPDATE #temp WITH(TABLOCKX) 
SET @R_ID = R_ID = CASE WHEN R_ID IS NULL THEN @R_ID ELSE R_ID END 
OPTION(MAXDOP 1); 

enter image description here

回答

0

一種方法是在內部查詢使用的更新語句:

UPDATE t1 
SET R_ID = ISNULL(R_ID, (
         SELECT TOP 1 R_ID 
         FROM #Temp t2 
         WHERE t2.ID = t1.Id 
         AND T2.[DATE] < t1.[DATE] 
         AND t2.R_ID IS NOT NULL 
         ORDER BY [DATE] DESC) 
       ) 
FROM #Temp t1 

測試更新:

SELECT * 
FROM #Temp 

結果:

ID DATE     R_ID 
L1 01.12.2016 00:00:00  NULL 
L1 02.12.2016 00:00:00  5 
L1 03.12.2016 00:00:00  5 
L2 01.12.2016 00:00:00  NULL 
L2 02.12.2016 00:00:00  8 
L2 03.12.2016 00:00:00  8 
L3 03.12.2016 00:00:00  3 
L3 04.12.2016 00:00:00  3 
L3 04.12.2016 00:00:00  3 
+0

邏輯正在工作,但查詢需要一個多小時才能更新90 m記錄。 – Rajini

+0

那麼,如果90米涉及90,000,000條記錄,那麼對於使用子查詢進行更新的時間並不長...... –