合并来自同一个表的条目,交替显示空列

时间:2015-11-13 17:45:35

标签: sql-server merge

我在SQL Server上有一个表,其结构如下:

ID           int identity not null,
Name_English nvarchar(max),
Name_Spanish nvarchar(max),

由于迁移,表格中的当前数据如下所示:

ID  Name_English    Name_Spanish
1   'Architecture'  null
2   null            'Arquitectura'
3   'Music'         null
4   'Sculpture'     null
5   null            'Música'
6   null            'Escultura'

我想将它们合并,以便它们看起来像这样:

ID  Name_English    Name_Spanish
1   'Architecture'  'Arquitectura'
3   'Music'         'Música'
4   'Sculpture'     'Escultura'

确切的ID并不重要,但它用于订单(这就是为什么架构不应该与Música合并)。而且,他们不能保证一个接一个地交替。原始数据已在块中更新。

我在考虑使用MERGE并按ROW_NUMBER()排序,但我不太清楚如何使用它们创建查询。

1 个答案:

答案 0 :(得分:2)

这是基于更新的样本数据的修订查询。正如所提出的,这确实利用了ROW_NUMBER()

我们从全表开始,内部连接到排序的所有英语单词,然后外连接到按正确顺序排序的所有西班牙单词。请注意,我们会根据原始ID从主YourTable加入EnglishSorted,然后使用ROW_NUMBER()加入EnglishSortedSpanishSorted套。这使我们最终可以更新所有英文行以获取相应的西班牙语行Name_Spanish数据。

最后,我们运行DELETE语句来清除所有原始西班牙语行,因为它们现在是多余的。

UPDATE
  YourTable
SET
  Name_Spanish = SpanishSorted.Name_Spanish
FROM
  YourTable
  INNER JOIN
  (
  SELECT
     ROW_NUMBER() OVER(ORDER BY [YourTable].[ID] ASC) AS [TempID],
     YourTable.[ID], 
     YourTable.Name_English
   FROM
     YourTable
   WHERE
     YourTable.Name_English IS NOT NULL
  ) EnglishSorted ON YourTable.[ID] = EnglishSorted.[ID]
  LEFT OUTER JOIN
  (
  SELECT
     ROW_NUMBER() OVER(ORDER BY [YourTable].[ID] ASC) AS [TempID],
     YourTable.[ID], 
     YourTable.Name_Spanish
   FROM
     YourTable
   WHERE
     YourTable.Name_Spanish IS NOT NULL
  ) SpanishSorted ON EnglishSorted.[TempID] = SpanishSorted.[TempID]
;

DELETE YourTable WHERE YourTable.Name_English IS NULL;

SELECT * FROM YourTable;

这可以作为fiddle使用。

以下是原始答案,它仅利用原始问题样本日期的“每隔一个”结构。我将它留在这里,所以下面的评论是有道理的。

我认为您不需要MERGE或在此使用ROW_NUMBER()。鉴于您的样本数据......

UPDATE 
    EnglishOnly
SET
    EnglishOnly.Name_Spanish = SpanishOnly.Name_Spanish
FROM
    YourTable EnglishOnly
    LEFT OUTER JOIN YourTable SpanishOnly ON EnglishOnly.[ID] + 1 = SpanishOnly.[ID]
WHERE
    EnglishOnly.Name_English IS NOT NULL

删除冗余行......

DELETE Your_Table WHERE YourTable.Name_English IS NULL;