表和示例数据的脚本
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
答案 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)
您无法发布多个插入以更新列(因此单独的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