与SQL Server中其他表中的属性相关的属性

时间:2017-01-02 08:25:04

标签: sql-server sql-server-2016

我需要使用基于NULL&的最后一个已知值的新值更新ID值。 DATE列。请注意,每当ID列发生更改时,非空值更新都应更改。

以下示例查询Null在L2&中被替换为5 01-12-2016行,但它应为null,因为ID更改为L2,5从L1行引入。但是,只要R_ID发生变化,我就需要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

1 个答案:

答案 0 :(得分:0)

一种方法是在内部查询中使用update语句:

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