Обновление столбца в таблице с повторяющимися строками

проблема с обновлением столбца в таблице с повторяющимися строками. У меня есть таблица "tab1", и ее данные выглядят так.

Id   col2   col3     col4  col5    col6       col7  
1    xim       M     gtt   tif      1          2  
2    white     M     abc   png      0          25  
2    white     M     abc   jpeg     0          25  
3    gtc       V     ftt   gif      4          72  

В этой таблице содержится дубликат идентификатора, но отличается только в col5. эта таблица содержит около 4000 строк я хотел бы обновить col5, чтобы результат выглядел следующим образом.

Id   col2   col3     col4  col5     col6       col7  
1    xim       M     gtt   tif       1          2  
2    white     M     abc   png,jpeg  0          25  
3    gtc       V     ftt   gif       4          72  

Есть ли способ обновить эту таблицу с помощью инструкции update, мне нужно создать временную таблицу для этого обновления..??

Ответ 1

Я согласен с комментариями, отправленными njk и Tony. Нецелесообразно денормализовать вашу базу данных, но, возможно, ваша конечная цель не так очевидна, и объединение расширений изображений подходит для вашей конкретной потребности.

Это делает то, что вы просите. Я уверен, что есть способ сделать это с XML тоже без использования курсора в функции...

use tempdb
go

create table tmp (
  id int, 
  col2 varchar(10), 
  col3 varchar(10), 
  col4 varchar(10), 
  col5 varchar(255), 
  col6 int, 
  col7 int
)
go

insert into tmp values
(1, 'xim', 'M', 'gtt', 'tif', 1, 2),
(2, 'white', 'M', 'abc', 'png', 0, 25),
(2, 'white', 'M', 'abc', 'jpeg', 0, 25),
(2, 'white', 'M', 'abc', 'gif', 0, 25),
(3, 'gtc', 'V', 'ftt', 'jpeg', 4, 72),
(3, 'gtc', 'V', 'ftt', 'tif', 4, 72),
(3, 'gtc', 'V', 'ftt', 'png', 4, 72),
(3, 'gtc', 'V', 'ftt', 'gif', 4, 72)
go

create function fnConcatCol5 (@id int) returns varchar(255) as
begin
  declare @rtn varchar(255) = '', @val varchar(10)

  declare cr cursor local for
    select col5 from tmp where id = @id

  open cr
  fetch next from cr into @val

  while @@fetch_status = 0
  begin
    set @rtn = @rtn + @val + ','
    fetch next from cr into @val
  end

  close cr
  deallocate cr

  set @rtn = left(@rtn, datalength(@rtn) - 1)

  return @rtn
end
go

-- it is more efficient to split up the 'distinct' and function call
-- into separate SQL statements so the function is only run *one* time
-- for each unique id

select distinct id, col2, col3, col4, col6, col7 
into #temp
from tmp

select id, col2, col3, col4, dbo.fnConcatCol5(id) as col5, col6, col7
from #temp
go

drop table tmp, #temp
go
drop function fnConcatCol5
go

Возвращенные данные выглядят следующим образом:

id    col2    col3    col4    col5                col6    col7
----- ------- ------- ------- ------------------- ------- ----
1     xim     M       gtt     tif                 1       2
2     white   M       abc     png,jpeg,gif        0       25
3     gtc     V       ftt     jpeg,tif,png,gif    4       72