SQL Server - Обновление столбцов с помощью предыдущего столбца без ключа - PullRequest
0 голосов
/ 25 октября 2018

У меня есть таблица SQL Server с пятью столбцами:

Field1, Field2,Field3,Field4,Field5

Теперь я загружаю данные из файла, который имеет значение Field1 и Field2 в 1-й строке, но только field3, field4, field5 во второй и третьей строке.

У меня нет ключевых столбцов в таблице на данный момент.

Мне нужно иметь возможность обновить field1& field2 второй и третьей строки со значением 1-й строки.

Это необходимо повторить для каждой строки без Field1 & Field2 с предыдущими строками.

Пожалуйста, предложите жизнеспособный ВАРИАНТ.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Другое решение, которое медленнее, включает в себя коррелированные подзапросы.Ваш пример был родительской строкой, за которой следуют две дочерние строки, которые повторяются.Это будет работать независимо от количества дочерних строк между родительскими строками:

drop table if exists #temp
go

select *
    into #temp
    from (
        values
         (1, 'a1', 'b1', null, null, null)
        ,(2, null, null, 'x1', 'y1', 'z1')
        ,(3, null, null, 'l1', 'm1', 'n1')
        ,(4, null, null, 'i1', 'j1', 'k1')
        ,(5, 'a2', 'b2', null, null, null)
        ,(6, null, null, 'x2', 'y2', 'z2')
        ,(7, null, null, 'l2', 'm2', 'n2')
    ) t(ID, f1, f2, f3, f4, f5)

update #temp
    set 
         f1 = (select top 1 f1 from #temp where f1 is not null and t.ID>=ID order by ID)
        ,f2 = (select top 1 f2 from #temp where f2 is not null and t.ID>=ID order by ID)
    from #temp t

select *
    from #temp
    where f3 is not null
    order by ID
0 голосов
/ 25 октября 2018

Тебе нужен ключ, никак не обойтись.Таблицы SQL не упорядочены, поэтому необходимо ввести поле упорядочения.Похоже, вы обрабатываете текстовые файлы ... если вам нужно добавить целое число, чтобы вы могли упорядочить свои записи.

Затем вы можете использовать комбинацию функции coalesce (возвращает первое ненулевое значение) иФункции задержки, такие как:

;with cte as (

    select  
         ID
        ,coalesce(
             f1
            ,lag(f1, 1) over (order by id)
            ,lag(f1, 2) over (order by id)
         ) f1
        ,coalesce(
             f2
            ,lag(f2, 1) over (order by id)
            ,lag(f2, 2) over (order by id)
         ) f2
        ,f3
        ,f4
        ,f5
        from (
            values
             (1, 'a1', 'b1', null, null, null)
            ,(2, null, null, 'x1', 'y1', 'z1')
            ,(3, null, null, 'l1', 'm1', 'n1')
            ,(4, 'a2', 'b2', null, null, null)
            ,(5, null, null, 'x2', 'y2', 'z2')
            ,(6, null, null, 'l2', 'm2', 'n2')
        ) t(ID, f1, f2, f3, f4, f5)
)
select *
    from cte
    where f3 is not null

Это вернет таблицу данных, такую ​​как:

2   a1  b1  x1  y1  z1
3   a1  b1  l1  m1  n1
5   a2  b2  x2  y2  z2
6   a2  b2  l2  m2  n2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...