如何通过仅更新TSQL中的NULL值来合并两行?

时间:2018-11-17 11:58:23

标签: sql-server tsql

我想通过保留一行基于其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)不应像上面的示例那样进行硬编码,因为我有很多不同的表。

表中有很多行,但我只想合并两行(这将始终是两行)

您能帮我吗?

1 个答案:

答案 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;