我有一个关键字表,我希望按顺序保持两个单词组合(即我不想要每两个单词组合,只要它们在彼此之前或之后)。
我可以使用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 :(得分: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