在同一查询中的2列上联接数据

时间:2018-11-05 11:48:47

标签: sql-server sql-server-2014

我正在尝试使用FOR XML技术连接字符串数据。结果是,我希望获得2个包含连接数据的不同列。我可以进行2次子选择来实现此目的,但是问题是我将实际使用的表非常庞大,并且对其进行2次扫描将增加很多开销。可以一次运行将这些数据加入吗?

DROP TABLE #test;
GO

CREATE TABLE #test
(
    col1 VARCHAR(MAX)
  , col2 VARCHAR(MAX)
);
GO

INSERT INTO #test VALUES ('1value', '2value'), ('11value', '22value');

SELECT SUBSTRING((   SELECT t.col1 + ';' AS [text()]
                       FROM #test AS t
                     FOR XML PATH(''))
               , 1
               , 20000) AS Note

预期结果:

| col1          | col2          |
|1value;11value | 2value;22value|

2 个答案:

答案 0 :(得分:1)

我会尝试远离FOR XML,因为它年代久远,在我的经验中很少使用。但是,从预期的输出来看,您希望连接来自两个不同行而不是列的字符串。这需要两个不同的数据集,因此需要两次表扫描。您至少可以通过CTE使它看起来不错吗?

WITH CTE AS (
  SELECT
    rownum = ROW_NUMBER() OVER (ORDER BY columns_to_order_by),
    col1, col2
  FROM #test
)
SELECT
  cur.col1 + prev.col1, cur.col2 + prev.col2, 
FROM CTE cur
INNER JOIN CTE prev on prev.rownum = cur.rownum - 1 

答案 1 :(得分:0)

DROP TABLE #test;
GO

CREATE TABLE #test
(
    col1 VARCHAR(MAX)
  , col2 VARCHAR(MAX)
);
GO

INSERT INTO #test VALUES ('1value', '2value'), ('11value', '22value');

SELECT STUFF((   SELECT ';' + t.col1  AS [text()]
                       FROM #test AS t
                     FOR XML PATH(''))
               , 1
               ,1
               , '') AS Note,
STUFF((   SELECT ';' + t.col2  AS [text()]
                       FROM #test AS t
                     FOR XML PATH(''))
               , 1
               ,1
               , '') AS Note2

-第二种方式

DECLARE @ Col1 VARCHAR(最大值) 十进制@ Col2 VARCHAR(MAX)

选择@ Col1 = COALESCE(@ Col1 +';','')+ t.col1       ,@ Col2 = COALESCE(@ Col2 +';','')+ t.col2 从#test AS t

选择@ Col1,@ Col2