2017-02-16 2 views
0

У меня есть таблица с миллионом записей. Мне нужно обновить некоторые столбцы, которые являются нулевыми, на основе существующих «не нулевых» записей для определенных столбцов на основе идентификаторов. Я попытался с одним запросом, он работает нормально, но я не уверен, что он сможет обновить все эти миллионные записи точно так, как мне нужно. Я предоставить вам некоторые примеры данных, как моя таблица выглядит 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  | 
+--------+---------+----------+--------+----------+ 

Я попытался это, но Я не могу заключить, правильно ли он обновляет все 1 миллион записей.

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, чтобы получить количество и имя элемента для каждого сотрудника, а затем заменить значения null значений количества и имени элемента с этими значениями. Для проверки используйте функцию COUNT, чтобы вычислить количество строк со значениями количества и имени элемента как null. Если число строк равно нулю, таблица корректно обновляется

Смежные вопросы