SQL-合并/更新和删除现有行

时间:2018-06-26 21:32:38

标签: sql sql-server

给出下表:

A    B    C    D    E
a1   b1   NULL NULL e1 
NULL NULL c1   d1   NULL
a1   b1   c1   NULL NULL

我想运行一个查询,只要至少其中一列具有相等的值(NULL = NULL时除外),就会合并/更新并删除现有行,以产生下表:

A    B    C    D    E
a1   b1   c1   d1   e1

请注意,任何列中都没有唯一的ID,因为任何ID都可能具有NULL值。

能请你帮忙吗?

已编辑:

如果任何列不具有相同的值,我希望它们成为单独的记录;这不会影响任何其他记录。

例如,如果第3行是:

A    B    C    D    E
a1   b1   c1   NULL e2

那么所需的输出将是:

A    B    C    D    E
a1   b1   NULL NULL e1 
a1   b1   c1   d1   e2

因为第1行已经具有e1 <> e2(因此保留为单独的记录);第2行和第3行是合并的,因为它们将c1共享为公共C值,并且不包含任何具有不同值的列(NULLS除外)。

另一个例子:

如果还有另一行,则第4行(带有原始表):

A    B    C    D    E
NULL NULL c1   d2   NULL

那么所需的输出将是:

A    B    C    D    E
a1   b1   c1   d1   e1
a1   b1   c1   d2   e1

1 个答案:

答案 0 :(得分:0)

这并不是真正的完整答案,而是可以帮助其他人理解问题并希望帮助他们朝正确方向提供完整答案的答案:

据我了解,您所描述的方案的根本问题是我们需要类似TRANSACTION(但可能不需要TRANSACTION)之类的东西,这将使我们能够完成以下步骤。

第1步。

在下表中,采用第一行并将其与所有其他行进行比较。

A    B    C    D    E
a1   b1   NULL NULL e1 
NULL NULL c1   d1   NULL
a1   b1   c1   NULL NULL

对于第一行,我们在[A]列中找到与第三行的匹配项,然后更新[B],[C],[D]和[E]列,然后删除第三行-给我们下表:

A    B    C    D    E
a1   b1   c1   NULL e1 
NULL NULL c1   d1   NULL

第2步

我们查看[B]列,没有找到匹配项。

第3步

我们查看[C]列并找到匹配项,因此我们更新当前行(第1行)。我们忽略/不合并NULL,因此我们得到了下表

A    B    C    D    E
a1   b1   c1   d1   e1

与此有关的问题是MERGE操作无法按所述进行。意思是说,一旦一行是MERGED,我们将移至下一行。

这是一个相当复杂的过程,所以我个人不确定如何解决它,只是想以一种“对开发人员更友好”的方式帮助解释问题。

我希望答案看起来像这样(我不认为您实际上可以在isnull子句中使用ON

MERGE Table2 AS target
USING Table1 as source
ON (isnull(target.[A], -1) = isnull(source.[A], -2) OR isnull(target.[B], -1) = isnull(source.[B], -2), etc.... )
WHEN MATCHED 
THEN UPDATE
    SET target.[A] = source.[A]

以此类推...