给出下表:
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
答案 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]
以此类推...