2017-02-16 132 views
0

我有一个有一百万条记录的表。我需要根据基于特定id的列的现有“非空”记录来更新一些null列。我试着用一个查询,它似乎工作正常,但我没有信心,它将能够完全按照我需要的方式更新所有这100万条记录。我为您提供一些示例数据我的桌子的外观like.Any帮助将不胜感激更新所有其他记录基于单个记录

SELECT * INTO #TEST FROM (
SELECT 1 AS EMP_ID,10 AS DEPT_ID,15 AS ITEM_NBR ,NULL AS AMOUNT,NULL AS ITEM_NME 
UNION ALL 
SELECT 1,20,16,500,'ABCD' 
UNION ALL 
SELECT 1,30,17,NULL,NULL 

UNION ALL 

SELECT 2,10,15,1000,'XYZ' 
UNION ALL 
SELECT 2,30,16,NULL,NULL 
UNION ALL 
SELECT 2,40,17,NULL,NULL 
) AS A 

的样本数据:

+--------+---------+----------+--------+----------+ 
| EMP_ID | DEPT_ID | ITEM_NBR | AMOUNT | ITEM_NME | 
+--------+---------+----------+--------+----------+ 
|  1 |  10 |  15 | NULL | NULL  | 
|  1 |  20 |  16 | 500 | ABCD  | 
|  1 |  30 |  17 | NULL | NULL  | 
|  2 |  10 |  15 | 1000 | XYZ  | 
|  2 |  30 |  16 | NULL | NULL  | 
|  2 |  40 |  17 | NULL | NULL  | 
+--------+---------+----------+--------+----------+ 

预期结果:

+--------+---------+----------+--------+----------+ 
| EMP_ID | DEPT_ID | ITEM_NBR | AMOUNT | ITEM_NME | 
+--------+---------+----------+--------+----------+ 
|  1 |  10 |  15 | 500 | ABCD  | 
|  1 |  20 |  16 | 500 | ABCD  | 
|  1 |  30 |  17 | 500 | ABCD  | 
|  2 |  10 |  15 | 1000 | XYZ  | 
|  2 |  30 |  16 | 1000 | XYZ  | 
|  2 |  40 |  17 | 1000 | XYZ  | 
+--------+---------+----------+--------+----------+ 

我试过,但我无法得出它是否正确更新所有100万条记录的结论。

SELECT * FROM #TEST T 
inner JOIN #TEST T1 ON T1.EMP_ID=T.EMP_ID 
WHERE T1.AMOUNT IS NOT NULL 

UPDATE T SET AMOUNT=T1.AMOUNT 
FROM #TEST T 
inner JOIN #TEST T1 ON T1.EMP_ID=T.EMP_ID 
WHERE T1.AMOUNT IS not NULL 

回答

0

我一直在使用内使用UPDATE加入

UPDATE T 
SET T.AMOUNT = X.AMT,T.ITEM_NME=X.I_N 
FROM #TEST T 
JOIN 
(SELECT EMP_ID,MAX(AMOUNT) AS AMT,MAX(ITEM_NME) AS I_N 
FROM #TEST 
GROUP BY EMP_ID) X ON X.EMP_ID = T.EMP_ID 
0
SELECT * into #Test1 
FROM #TEST 
WHERE AMOUNT IS NOT NULL 

对于记录验证运行此查询第一

SELECT T.AMOUNT, T1.AMOUNT, T1.EMP_ID,T1.EMP_ID 
FROM #TEST T 
inner JOIN #TEST1 T1 ON T1.EMP_ID=T.EMP_ID 
WHERE T.AMOUNT IS NULL 

Begin Trans 

UPDATE T 
SET T.AMOUNT=T1.AMOUNT, T.ITEM_NME= = T1.ITEM_NME 
FROM #TEST T 
inner JOIN #TEST1 T1 ON T1.EMP_ID=T.EMP_ID 
WHERE T.AMOUNT IS NULL 

rollback 
0
SELECT EMP_ID,MAX(AMOUNT) as AMOUNT MAX(ITEM_NAME) as ITEM_NAME 
      INTO #t 
    FROM #TEST 
    GROUP BY EMP_ID 


UPDATE t SET t.AMOUNT = t1.AMOUNT, t.ITEM_NAME = t1.ITEM_NAME 
FROM #TEST t INNER JOIN #t t1 
ON t.emp_id = t1.emp_id 
WHERE t.AMOUNT IS NULL and t.ITEM_NAME IS NULL 

使用MAX一ggregate函数获取每个员工的金额和项目名称,然后用这些值替换金额和项目名称的值。对于验证,使用COUNT函数来计算金额和项目名称值为空的行数。如果行数为零,则表格更新正确

相关问题