2016-09-19 108 views
3

我有一个关键字表,我想使2个字的组合,而保持在连续的顺序(即我不希望每2个字的组合,只是当他们是之前或之后另一个)。SQL Combine 2行一次

我可以使这个工作与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 

有没有人知道更聪明/更有效的方式,我可以做到这一点?

+0

你使用哪种DBMS? – NEER

+0

SQL Server Management Studio 2014 –

回答

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 
+1

钉住了它。谢谢! –

3

您可以使用以下

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

希望这将帮助你

+0

这个人在第一行返回NULL,但我可以看到它是如何被调整的。谢谢哈迪! –

1

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

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

也是一个有效的答案。谢谢! –

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 
+0

另一个很好的 - 谢谢! –

1

我认为,我们可以简单地通过使用LEFT JOIN与同桌做,ultimiately我们必须使用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 
+0

这个也适用。 +1 –