我有两个SQL Server表。一个表有四个nvarchar(50)
可空列和一个ID
列。第二个表格有两列:ID
,nvarchar(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创建新行。
答案 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