根据另一个表中的数据更新/创建SQL Server表中的行

时间:2011-10-25 05:23:43

标签: sql-server tsql

我有两个SQL Server表。一个表有四个nvarchar(50)可空列和一个ID列。第二个表格有两列:IDnvarchar(50)可以为空的列

我正在尝试将第二个表中的行插入到第一个表中。如何检测第一个表中的空列并将第二个数据中的数据插入空单元格?

例如:

从第二张表中添加

1   value3

到第一个表

1     value1   value2   null    null

所以生成的行是

1     value1   value2   value3   null

练习2:

从第二张表中添加

2   value1

到第一个表

nothing for ID 2

所以生成的行是

2     value1   null   null   null

基本上我需要更新现有行或根据第二个表行的ID创建新行。

2 个答案:

答案 0 :(得分:2)

declare @T1 table
(
  ID int primary key,
  C1 varchar(50),
  C2 varchar(50),
  C3 varchar(50),
  C4 varchar(50)
);

declare @T2 table
(
  ID int primary key,
  C varchar(50)  
);

insert into @T1 values (1, 'value1', 'value2', null, null) ;

insert into @T2 values (1, 'value3');
insert into @T2 values (2, 'value1');

merge @T1 as T1
using @T2 as T2
on T1.ID = T2.ID
when not matched then
  insert (ID, C1)  values (T2.ID, T2.C)
when matched then
  update set
    C1 = case when T1.C1 is null 
           then T2.C 
           else T1.C1 
         end,
    C2 = case when T1.C1 is not null and 
                   T1.C2 is null 
           then T2.C 
           else T1.C2 
         end,
    C3 = case when T1.C1 is not null and 
                   T1.C2 is not null and 
                   T1.C3 is null 
           then T2.C 
           else T1.C3 
         end,
    C4 = case when T1.C1 is not null and 
                   T1.C2 is not null and 
                   T1.C3 is not null and 
                   T1.C4 is null 
           then T2.C 
           else T1.C4 
         end
;

select *
from @T1;

结果:

ID C1     C2     C3     C4
-- ------ ------ ------ ------
1  value1 value2 value3 NULL
2  value1 NULL   NULL   NULL

答案 1 :(得分:0)

这是另一种尝试。我在这里完全改变了你的架构,但你仍然觉得它很有用。

未排序的值集

对于这个答案,我假设列顺序并不重要(你基本上是在它们中存储一组值)。我认为 this 的更好的架构是将每个值存储在不同的行上。这使得查询和修改变得更加容易(因此我对您的问题发表评论)。

在这种情况下,我要做的是创建一个如下所示的新表:

ID    ValueSet
1     value1
1     value2
1     value3
2     value1

要将两个表转换为此表,可以使用以下查询:

SELECT ID,C1 AS `ValueSet` FROM `tab1` WHERE C1 IS NOT NULL
   UNION SELECT ID,C2 FROM `tab1` WHERE C2 IS NOT NULL
   UNION SELECT ID,C3 FROM `tab1` WHERE C3 IS NOT NULL
   UNION SELECT ID,C4 FROM `tab1` WHERE C4 IS NOT NULL
   UNION SELECT ID,C1 FROM `tab2` WHERE C1 IS NOT NULL

这样就可以删除NULL值,并在需要时正常添加tab2值。

再次注意,您在这里松开了列顺序。

排序值集

如果订单很重要,您仍然可以在创建时使用此修改后的查询包含:

SELECT ID,C1 AS `ValueSet`,'1' AS 'Order'  FROM `tab1` WHERE C1 IS NOT NULL
UNION SELECT ID,C2,'2' FROM `tab1` WHERE C2 IS NOT NULL
UNION SELECT ID,C3,'3' FROM `tab1` WHERE C3 IS NOT NULL
UNION SELECT ID,C4,'4' FROM `tab1` WHERE C4 IS NOT NULL
UNION SELECT ID,C1,'5' FROM `tab2` WHERE C1 IS NOT NULL

然后,如果您需要ID 1的排序值集,则可以使用:

SELECT ValueSet FROM `myNewTable` WHERE ID = '1' ORDER BY Order ASC;

将产生:

value1
value2
value3