我想通过保留一行基于其ID的数据并仅在其为NULL值时才更新数据来合并两行数据。
作为示例,我想“合并”第1行和第2行并删除第2行:
发件人:
ID date col1 col2 col3
---------------------------------------------------------------
1 31/12/2017 1 NULL 1
2 31/12/2015 3 2 NULL
3 31/12/2014 4 5 NULL
收件人:
ID date col1 col2 col3
---------------------------------------------------------------
1 31/12/2017 1 2 1
3 31/12/2014 4 5 NULL
在该示例中,我想保留第1行,并用第2行中的值填充第1行中的NULL值。然后,我将删除第2行。请参见下面为date列编写的代码。
UPDATE MyTable
SET
date = newdata.date
FROM
(
SELECT
date
FROM MyTable
WHERE
ID = 2
)
newdata
WHERE
ID = 1 AND MyTable.date IS NULL ;
我想在非常大的表上执行相同的操作,因此我正在寻找一种方法,将上述操作自动(或更好的解决方法?)自动应用于表中两行的每一列。
需要明确的是,列名(date
)不应像上面的示例那样进行硬编码,因为我有很多不同的表。
表中有很多行,但我只想合并两行(这将始终是两行)
您能帮我吗?
答案 0 :(得分:3)
我现在将其发布为答案,因为OP的评论似乎可以推断出这确实很简单,因为我认为并非如此。尽管他们的表有很多行,但是他们只对校正/合并第1行和第2行的值感兴趣。由于这些行都很简单,因此您可以简单地arr1
ID 1的值,然后{{1 }}第2行。
因为只有几列,所以您可以简单地使用文字值,因为我们可以直观地看到ID 1上的UPDATE
仅需要更新:
DELETE
现在ID 1具有正确的值,您可以Col2
ID 2:
UPDATE YourTable
SET col2 = 2
WHERE ID = 1;
但是,如果您的数据过于简化,则可以执行以下操作。
DELETE
这是基于OP的问题下的所有评论,这些评论会提供(em> some 更多(但不够)的详细信息。这是一个可扩展的动态SQL解决方案,因为它为OP编写了DELETE
FROM YourTable
WHERE ID = 2;
表达式。当然,如果这无济于事,那么我再次建议他们更新其职位,以实际帮助我们帮助他们。无论如何,这应该是不言而喻的:
UPDATE YT1
SET Col1 = ISNULL(YT1.Col1,YT2.Col1),
Col2 = ISNULL(YT1.Col2,YT2.Col2),
Col3 = ISNULL(YT1.Col3,YT2.Col3),
...
FROM YourTable YT1
JOIN YourTable YT2 ON YT2.ID = 2
WHERE YT1.ID = 1;
DELETE
FROM YourTable
WHERE ID = 2;