2017-01-08 19 views
0

У меня есть данные, что выглядит следующим образом:TSQL Обновление запроса

Seq PairSeq LineType Aline Bline 
1 451  L   -3  3 
2 451  O   NULL NULL 
3 453  O   NULL NULL 
4 453  L   2.5  -2.5 

Мне нужно просто обновить NULLs со значениями от обмена ту же пару SEQ подряд. Я попытался сделать это с помощью цикла. Может ли кто-нибудь предложить эффективный способ выполнить это обновление? Заранее спасибо.

+0

Всегда ли LineType = 'O' те, у которых есть значения NULL? – McNets

+0

Да, код ниже выполняет работу красиво. – Riskworks

ответ

0

Вы используете подзапрос или cte. При использовании sql вам следует избегать использования циклов.

Я печатаю мой телефон, поэтому не легко, но если нужно изменить только одно значение, вы можете сделать это с помощью подзапроса. Для многоуровневых значений я бы предложил использовать cte.

Обновление таблицы Set выравнивать = (выберите x.aline из таблицы х, где выравнивать не утратившим x.seq = table.seq) и выравнивать не является нулевым

2

Попробуйте это:

UPDATE YourTable 
SET Aline = T2.Aline, Bline = T2.Bline 
FROM YourTable T1 
    INNER JOIN (SELECT Seq, PairSeq, Aline, Bline 
       FROM YourTable 
       WHERE Aline IS NOT NULL and Bline IS NOT NULL) T2 
    ON T1.PairSeq = T2.PairSeq 
WHERE T1.Aline IS NULL AND T1.Bline IS NULL; 
0
CREATE TABLE #tt(seq INT,PairSeq INT,LineType VARCHAR(100),Aline FLOAT,Bline FLOAT) 
    INSERT INTO #tt 
    SELECT 1,451,'L',-3,3 UNION 
    SELECT 2,451,'O',NULL,NULL UNION 
    SELECT 3,453,'O',NULL,NULL UNION 
    SELECT 4,453,'L',2.5,-2.5 

    UPDATE t SET t.Aline=o.Aline,t.Bline=o.Bline FROM #tt AS t 
    INNER JOIN #tt AS o ON t.PairSeq=o.PairSeq AND o.Aline IS NOT NULL AND o.Bline IS NOT NULL 
    WHERE t.Aline IS NULL OR t.Bline IS NOT NULL 
Смежные вопросы