Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-合并/更新&;从现有行中删除_Sql_Sql Server - Fatal编程技术网

SQL-合并/更新&;从现有行中删除

SQL-合并/更新&;从现有行中删除,sql,sql-server,Sql,Sql Server,鉴于下表: 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 a1 b1 c1 d1 e1 A B C D E a1 b1 c1 NULL e1 NULL NULL c1 d1 NULL 我想运行一个查询,每当至少有一列的值相等(NULL=NUL

鉴于下表:

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
a1   b1   c1   d1   e1
A    B    C    D    E
a1   b1   c1   NULL e1 
NULL NULL c1   d1   NULL
我想运行一个查询,每当至少有一列的值相等(NULL=NULL时除外)时,该查询将合并/更新并删除现有行,从而生成下表:

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
a1   b1   c1   d1   e1
A    B    C    D    E
a1   b1   c1   NULL e1 
NULL NULL c1   d1   NULL
请注意,任何列中都没有唯一的ID,因为任何列都可能有空值

你能帮忙吗

编辑: 如果任何列不共享相同的值,我会将它们作为单独的记录;这不会影响任何其他记录

例如,如果第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
A    B    C    D    E
a1   b1   c1   d1   e1
a1   b1   c1   d2   e1
因为第1行已经有一个e1 e2(所以作为一个单独的记录保留);第2行和第3行合并,因为它们共享c1作为公共C值,并且没有任何具有不同值的列(空值除外)

另一个例子:

如果有其他行,第4行(与原始表一起):

那么所需的输出将是:

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

这并不是一个完整的答案,而是一个有助于其他人理解问题并有助于引导他们朝着正确方向提供完整答案的答案:

据我所知,您描述的场景的基本问题是,我们需要类似于
事务
(但可能不是
事务
)的东西,这将以某种方式允许我们完成以下步骤

第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   NULL NULL e1 
NULL NULL c1   d1   NULL
a1   b1   c1   NULL NULL
A    B    C    D    E
a1   b1   c1   d1   e1
A    B    C    D    E
a1   b1   c1   NULL e1 
NULL NULL c1   d1   NULL
步骤2

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

步骤3

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

A    B    C    D    E
a1   b1   c1   d1   e1
这方面的问题是
MERGE
操作无法按所述工作。我的意思是,一旦一行被合并,我们就进入下一行

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

我希望答案是这样的(我不认为您可以在
ON
子句中实际使用
isnull
):


以此类推……

您应该展示一个更好的数据示例,该示例汇总到多行。此外,如果示例数据中的第3行包含E值e2,您将如何处理这种情况?或者存在C值为c1、D值为d2的附加行的情况?