2015-11-13 65 views
0

我有一个表的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合并)。另外,它们不能保证一个接一个地交替。原始数据已分块更新。

我想使用MERGEROW_NUMBER()排序,但我不知道如何使用它们来创建查询。

回答

2

下面是基于更新后的示例数据的修订查询。如提议的那样,这确实利用了ROW_NUMBER()

我们从整个表格开始,内部连接到所有英文单词排序,然后外部连接到按正确顺序排序的所有西班牙语单词。请注意,我们根据原始ID从主YourTableEnglishSorted加入,然后使用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; 
+0

这似乎是工作,但输入的数据的方式,它不能保证为英文条目是奇数和西班牙人是偶数。我会更新这个问题。 –

+0

该死的,根据你的初始样本数据,我以为我们是保证每隔一个。通过修改后的例子,我们是否可以保证包含'Name_English'的非空值的行的下一行包含'Name_English'的空值将包含相应的'Name_Spanish'?即使这样,你也必须回溯到捕捉西班牙语单行时跳过的英文单词,然后避免重复使用之前通过的(然后在前面回溯)西班牙语定义(以避免“音乐”和“雕塑”在修改后的样本数据中都会获得'Música')。 – LDMJoe

+0

是的,英文中的空值保证具有西班牙语的价值,反之亦然。 –