我正在尝试将值插入到来自其他(查找)表的表中。
表中的前3个结果被选中,需要在它们插入另一个表之前连接起来。
如何更改以下插入以首先连接它们,并且3个名称之间没有分隔符(例如:JohnMaxLouise)?
INSERT INTO Table 2 VALUES ((SELECT TOP 3 names FROM Table1 ORDER BY NEWID()))
我正在使用SQL Server 2016,因此string_agg不可用。
答案 0 :(得分:0)
就我个人而言,我认为条件聚合最简单:
INSERT INTO Table2
SELECT (MAX(CASE WHEN seqnum = 1 THEN name ELSE '' END) +
MAX(CASE WHEN seqnum = 2 THEN name ELSE '' END) +
MAX(CASE WHEN seqnum = 3 THEN name ELSE '' END)
)
FROM (SELECT name, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) as seqnum
FROM (SELECT TOP 3 name
FROM Table1
ORDER BY NEWID()
) t
) t;
另一种选择是XML方法,但是如果你知道你需要三种方法,那么条件聚合(或pivot
)就可以了。
答案 1 :(得分:0)
尝试以下方法:
declare @tab table (names varchar(max))
declare @tab1 table ([name] varchar(100))
insert into @tab1
select 'John' union select 'Max' union select 'Louise' union select 'xxx'
insert into @tab select (select top 3 [name] + '' from @tab1 for xml path(''))
select * from @tab
感谢。
答案 2 :(得分:0)
这将返回' 1,2,3,4'
DECLARE @x TABLE (i INTEGER)
DECLARE @r VARCHAR(255)
INSERT INTO @x VALUES (1),(3),(2),(4)
SELECT @r= STUFF(( SELECT ',' + CAST(i AS VARCHAR(max))
FROM @x
ORDER BY i
FOR XML PATH(''), type
).value('.','varchar(255)'), 1, 1, '')
SELECT @r
答案 3 :(得分:0)
您可以使用FOR XML PATH('')
来实现此目的,只需使用以下命令:
SELECT '' + NAME
FROM (SELECT Top 3 NAME FROM TBL_1 ORDER BY NEWID()) AS T
FOR XML PATH('')
或简单连接
SELECT @x = @x + NAME
FROM (SELECT Top 3 NAME FROM TBL_1 ORDER BY NEWID()) AS T1
首先,我使用以下查询
创建了测试环境 CREATE TABLE TBL_1 (NAME Varchar(50))
CREATE TABLE TBL_2 (NAME Varchar(50))
INSERT INTO TBL_1 (Name) VALUES ('John'),('Max'),('Louise'),('Mark'),('Peter')
然后我使用以下命令
DECLARE @x varchar(255)
SELECT @x = (SELECT '' + NAME
FROM (SELECT Top 3 NAME FROM TBL_1 ORDER BY NEWID()) AS T1
FOR XML PATH('') )
INSERT INTO TBL_2(NAME) SELECT @x;
SELECT * FROM TBL_2
结果为JohnLouiseMax
DECLARE @x varchar(255)
SET @x = ''
SELECT @x = @x + NAME
FROM (SELECT Top 3 NAME FROM TBL_1 ORDER BY NEWID()) AS T1
INSERT INTO TBL_2(NAME) SELECT @x;
SELECT * FROM TBL_2