在select中连接结果

时间:2017-12-10 14:57:39

标签: sql sql-server database relational-database

我正在尝试将值插入到来自其他(查找)表的表中。

表中的前3个结果被选中,需要在它们插入另一个表之前连接起来。

如何更改以下插入以首先连接它们,并且3个名称之间没有分隔符(例如:JohnMaxLouise)?

INSERT INTO Table 2 VALUES ((SELECT TOP 3 names FROM Table1 ORDER BY NEWID()))

我正在使用SQL Server 2016,因此string_agg不可用。

4 个答案:

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

详细解决方案

SQLFiddle Demo

  1. 首先,我使用以下查询

    创建了测试环境
     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')
    
  2. 然后我使用以下命令

    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
    
  3. 结果为JohnLouiseMax

    enter image description here

    1. 或者您可以使用简单连接来实现此目的
    2. SQLFiddle Demo

          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