我在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()
排序,但我不太清楚如何使用它们创建查询。
答案 0 :(得分:2)
这是基于更新的样本数据的修订查询。正如所提出的,这确实利用了ROW_NUMBER()
。
我们从全表开始,内部连接到排序的所有英语单词,然后外连接到按正确顺序排序的所有西班牙单词。请注意,我们会根据原始ID从主YourTable
加入EnglishSorted
,然后使用ROW_NUMBER()
加入EnglishSorted
和SpanishSorted
套。这使我们最终可以更新所有英文行以获取相应的西班牙语行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;