SQL一次组合2行

时间:2016-09-19 13:22:30

标签: sql sql-server sql-server-2014

我有一个关键字表,我希望按顺序保持两个单词组合(即我不想要每两个单词组合,只要它们在彼此之前或之后)。

我可以使用WHILE循环来完成此工作,但是查询很笨并且不是最佳的,因为我需要在更大的查询中使用它。我的查询如下:

IF OBJECT_ID('tempdb..#Temp') IS NOT NULL
    DROP TABLE #Temp

CREATE TABLE #Temp
(
    RowNum INT
    ,Keyword VARCHAR(50)
)

INSERT #Temp
VALUES
(1, 'Apple'),
(2, 'Flavored'),
(3, 'Ice'),
(4, 'Tea')

IF OBJECT_ID('tempdb..#Final') IS NOT NULL
    DROP TABLE #Final

CREATE TABLE #Final
(
    Combined VARCHAR(101)
)

DECLARE @i INT
DECLARE @kw1 VARCHAR(50)
DECLARE @kw2 VARCHAR(50)

SET @i = 2

WHILE EXISTS (SELECT * FROM #Temp WHERE RowNum = @i)
BEGIN

    SET @kw1 = (SELECT Keyword FROM #Temp WHERE RowNum = @i - 1)
    SET @kw2 = (SELECT Keyword FROM #Temp WHERE RowNum = @i)

    INSERT #Final
    SELECT @kw1 + ' ' + @kw2

    SET @i = @i + 1

END

SELECT * FROM #Final

有谁知道我能做到更聪明/更有效的方法吗?

5 个答案:

答案 0 :(得分:3)

您可以使用以下

insert into #Final(Combined)
select Keyword + ' ' + Lag(Keyword,1,null) over (order by RowNum)
from #Temp
where RowNum>=2

希望这会对你有所帮助

答案 1 :(得分:2)

您可以使用LEAD,如下所示:

SELECT * FROM
(
    SELECT
        T.Keyword + ' ' + LEAD(T.Keyword) OVER (ORDER BY RowNum) Result
    FROM #Temp T
) A
WHERE
    A.Result IS NOT NULL 

答案 2 :(得分:1)

您的代码意味着rownum列没有间隙。然后你可以在我记得的任何Sql Server版本上使用plain JOIN。

select t1.Keyword + ' '+ t2.Keyword
from #temp t1
join #temp t2 on t2.RowNum = t1.RowNum +1

答案 3 :(得分:1)

如果您使用的是sql 2012或更高版本,请使用以下脚本。

;WITH cte_1
as
(SELECT Keyword+' '+LEAD(Keyword) OVER(ORDER BY RowNum) Combined
FROM #temp ) 
SELECT *
FROM cte_1
WHERE Combined is not null

答案 4 :(得分:1)

我认为我们可以通过使用同一个表的LEFT JOIN来实现,最终我们必须使用RowNum

SELECT CONCAT(t2.Keyword, ' ', t1.Keyword) KeyWords
FROM #temp t1
LEFT JOIN #temp t2 ON t1.RowNum = t2.RowNum+1
WHERE t2.Keyword IS NOT NULL