SQL Server - 将包含其他列值的列更新为CSV

时间:2011-07-28 21:28:12

标签: sql sql-server sql-server-2005 tsql

表和示例数据的脚本

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 个答案:

答案 0 :(得分:7)

听起来像OP需要更新声明。

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]

答案 1 :(得分:3)

你的问题的关键似乎是根据id连接#temptable2中的值。 Jeff Moden在Concatenation Functions and Some Tuning Myths

上有一篇很好的文章

虽然整篇文章值得一读,但关键是你可以轻松地使用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

答案 2 :(得分:1)

首先创建一个函数:

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)

答案 3 :(得分:0)

这会起作用吗?

INSERT INTO #TEMPTABLE1 SELECT ID,COL2 FROM #TEMPTABLE2 GROUP BY ID

答案 4 :(得分:0)

您无法发布多个插入以更新列(因此单独的insertupdate语句)。我看到两个选择:

插入然后更新

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