SQL Server - обновить столбец с другими значениями столбца как CSV - PullRequest
2 голосов
/ 29 июля 2011

Скрипт для таблицы и данных примера

CREATE TABLE #TEMPTABLE1(ID INT, COL1 NVARCHAR(10))
CREATE TABLE #TEMPTABLE2(ID INT, COL2 NVARCHAR(10))

INSERT INTO #TEMPTABLE1 (ID) VALUES(1)
INSERT INTO #TEMPTABLE1 (ID) VALUES(2)
INSERT INTO #TEMPTABLE1 (ID) VALUES(3)

INSERT INTO #TEMPTABLE2 (ID,COL2) VALUES(1,'A')
INSERT INTO #TEMPTABLE2 (ID,COL2) VALUES(1,'B')
INSERT INTO #TEMPTABLE2 (ID,COL2) VALUES(1,'C')
INSERT INTO #TEMPTABLE2 (ID,COL2) VALUES(2,'X')
INSERT INTO #TEMPTABLE2 (ID,COL2) VALUES(2,'Y')
INSERT INTO #TEMPTABLE2 (ID,COL2) VALUES(3,'Z')

Мне нужно обновить #TEMPTABLE1, чтобы

ID COL1
---------
1  A,B,C 
2  X,Y
3  Z

Ответы [ 5 ]

7 голосов
/ 29 июля 2011

Звучит так, как будто ОП хотел обновить заявление.

UPDATE [x]
SET
    [COL1] = STUFF
            (
                (
                    SELECT
                        N',' + [COL2]
                    FROM
                        [#TEMPTABLE2] AS [y]
                    WHERE
                        [y].[ID] = [x].[ID]
                    FOR XML PATH(''), TYPE
                ).value(N'.', N'nvarchar(10)'), 
                1, 1, N''
            )
OUTPUT INSERTED.*
FROM
    [#TEMPTABLE1] AS [x]
3 голосов
/ 29 июля 2011

Кажется, ключом к вашему вопросу является объединение значений в # temptable2 на основе идентификатора.У Джеффа Модена есть отличная статья на эту тему: Функции конкатенации и некоторые настраивающие мифы

Хотя всю статью стоит прочитать, главное, что вы можете легко использовать Stuff и For XML Path сподзапрос для объединения на основе столбца ID.Затем вы можете легко использовать это для обновления # temptable1.

Изменить, чтобы добавить пример

Конкатенация будет выглядеть примерно так:

SELECT t1.ID,        
STUFF((SELECT ','+t2.value
   FROM dbo.TestData t2 
   WHERE t1.ID = t2.SomeID FOR XML PATH('')),1,1,'')   
FROM dbo.TestData t1  
GROUP BY t1.ID
1 голос
/ 29 июля 2011

Сначала создайте функцию:

CREATE FUNCTION CommaValues(@ID as INT)
returns varchar(500)
as
begin
DECLARE @DelimList as varchar(500)

select @DelimList = COALESCE(@DelimList + ', ', '') + Col2
from #TEMPTABLE2
where ID = @ID

return @DelimList
end

, а затем используйте ее в своем обновлении:

UPDATE #TEMPTABLE1 set Col1 = CommaValues(ID)
0 голосов
/ 29 июля 2011

Вы не сможете выполнить несколько вставок для обновления столбца (следовательно, отдельных операторов insert и update).Я вижу два варианта:

Вставить, затем обновить

INSERT INTO #TEMPTABLE2 (ID,COL2) VALUES(1,'A')
UPDATE #TEMPTABLE2 SET COL2 = COL2 + ',' + B WHERE ID = 1
UPDATE #TEMPTABLE2 SET COL2 = COL2 + ',' + C WHERE ID = 1

Это довольно грязно, но работает.

Вставить, но выбратьв список через запятую
В этом случае вы можете сделать свой первичный ключ комбинацией ID и COL2 (хотя я не уверен, что рекомендую это) и вставить значения, как вы делаете это выше,Затем, когда вам нужен список с разделителями-запятыми, выберите его как таковой, например, используя разбор (как указано в Pinal Dave ):

DECLARE @listStr VARCHAR(MAX)
SELECT @listStr = COALESCE(@listStr+',' ,'') + Name
FROM Production.Product
0 голосов
/ 29 июля 2011

Будет ли это работать:

INSERT INTO #TEMPTABLE1 SELECT ID,COL2 FROM #TEMPTABLE2 GROUP BY ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...