【问题标题】:SQL Combine 2 Rows at a TimeSQL 一次合并 2 行
【发布时间】:2016-09-19 13:22:30
【问题描述】:

我有一张关键字表,我想在保持顺序的同时将其组合成 2 个单词组合(即,我不希望每个 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

有谁知道我可以用更聪明/更有效的方法来完成这项工作?

【问题讨论】:

  • 您使用哪种 DBMS?
  • SQL Server 管理工作室 2014

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


【解决方案1】:

你可以使用以下

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

希望对你有帮助

【讨论】:

  • 这个第一行返回NULL,但我可以看到它是如何调整工作的。谢谢哈迪!
【解决方案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 

【讨论】:

  • 成功了。谢谢!
【解决方案3】:

您的代码暗示 rownum 列没有间隙。然后,您可以在我记得的任何 Sql Server 版本上使用普通 JOIN。

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

【讨论】:

  • 也是一个有效的答案。谢谢!
【解决方案4】:

如果您使用的是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

【讨论】:

    【解决方案5】:

    我认为我们可以简单地通过对同一张表使用 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
    

    【讨论】:

      猜你喜欢
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 2017-01-31
      • 1970-01-01
      • 2012-06-30
      • 2019-01-14
      • 1970-01-01
      • 2022-01-21
      相关资源
      最近更新 更多