2016-09-19 29 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 –