Sql server SQL Server:合并两个表中的数据
我有两个表,如下所示,并尝试使用merge获得指定的结果。可能吗 表1: 我发现了另一个条件,并且存在问题,第5行的数据在这种情况下是非活动的,而不是以任何方式更新该行,我需要添加具有相同详细信息但为活动行的新行。关于如何更新脚本的任何建议。表1存在标识列,因此数据不会重复 在查看现有记录的同时,比较表2中的数据并更新表1中的数据 表2: 结果: 请试试这个-Sql server SQL Server:合并两个表中的数据,sql-server,tsql,Sql Server,Tsql,我有两个表,如下所示,并尝试使用merge获得指定的结果。可能吗 表1: 我发现了另一个条件,并且存在问题,第5行的数据在这种情况下是非活动的,而不是以任何方式更新该行,我需要添加具有相同详细信息但为活动行的新行。关于如何更新脚本的任何建议。表1存在标识列,因此数据不会重复 在查看现有记录的同时,比较表2中的数据并更新表1中的数据 表2: 结果: 请试试这个- merge @table1 t1 using @table2 t2 on t2.table1_id = t1.id when not m
merge @table1 t1
using @table2 t2 on t2.table1_id = t1.id
when not matched by source
then update set t1.active = 0
when not matched by target then
insert (id, q1a, q2a, q3a, active)
values (t2.table1_id, t2.e1, t2.e2, t2.e3, 1);
数据脚本-
declare @table1 table (id int, q1a int, q2a varchar(10), q3a int, active bit)
declare @table2 table (table1_id int, e1 int, e2 varchar(10), e3 int)
insert into @table1
select 1,2,'test',1,1 union
select 2,3,'test2',1,1 union
select 3,4,'test3',1,1 union
select 4,5,'test4',1,1
insert into @table2
select 1,2,'testdata1',1 union
select 2,3,'testdata2',1 union
select 3,4,'testdata3',1 union
select 5,5,'testdata5',1 union
select 6,7,'testdata6',0
select * from @table1
select * from @table2
请试试这个-
merge @table1 t1
using @table2 t2 on t2.table1_id = t1.id
when not matched by source
then update set t1.active = 0
when not matched by target then
insert (id, q1a, q2a, q3a, active)
values (t2.table1_id, t2.e1, t2.e2, t2.e3, 1);
数据脚本-
declare @table1 table (id int, q1a int, q2a varchar(10), q3a int, active bit)
declare @table2 table (table1_id int, e1 int, e2 varchar(10), e3 int)
insert into @table1
select 1,2,'test',1,1 union
select 2,3,'test2',1,1 union
select 3,4,'test3',1,1 union
select 4,5,'test4',1,1
insert into @table2
select 1,2,'testdata1',1 union
select 2,3,'testdata2',1 union
select 3,4,'testdata3',1 union
select 5,5,'testdata5',1 union
select 6,7,'testdata6',0
select * from @table1
select * from @table2
我能够使用下面的脚本精确匹配结果。希望这有帮助!如果你有任何问题,请告诉我
/*
Script to create the tables and merge the data
*/
-- drop table #Table1;
create table #Table1 (
Table1ID INT,
Q1A INT,
Q2A varchar(10),
Q3A INT,
Active BIT
);
INSERT INTO #Table1 VALUES (1, 2, 'Test', 1, 1);
INSERT INTO #Table1 VALUES (2, 3, 'Test2', 1, 1);
INSERT INTO #Table1 VALUES (3, 4, 'Test3', 1, 1);
INSERT INTO #Table1 VALUES (4, 5, 'Test4', 1, 1);
-- drop table #Table2;
create table #Table2 (
Table1ID INT,
E1 INT,
E2 varchar(10),
E3 INT
);
INSERT INTO #Table2 VALUES (1, 2, 'TestData1', 1);
INSERT INTO #Table2 VALUES (2, 3, 'TestData2', 1);
INSERT INTO #Table2 VALUES (3, 4, 'TestData3', 1);
INSERT INTO #Table2 VALUES (5, 5, 'TestData5', 1);
INSERT INTO #Table2 VALUES (6, 7, 'TestData6', 0);
;MERGE INTO #Table1 AS TGT
USING #Table2 AS SRC
ON TGT.Table1ID = SRC.Table1ID
WHEN NOT MATCHED BY SOURCE THEN UPDATE
SET TGT.Active = CAST(0 AS BIT)
WHEN NOT MATCHED THEN INSERT (Table1ID, Q1A, Q2A, Q3A, Active)
VALUES (SRC.Table1ID, SRC.E1, REPLACE(SRC.E2, 'Data', ''), SRC.E3, CAST(1 AS BIT));
select *
from #Table1;
您还可以使用变量代替表格,如下所示:
DECLARE @Table1ID INT = 1,
@E1 INT = 2,
@E2 varchar(10) = 'TestData1',
@E3 INT = 1;
;MERGE INTO #Table1 AS TGT
USING (VALUES(@Table1ID, @E1, @E2, @E3))
AS SRC (Table1ID, E1, E2, E3)
ON TGT.Table1ID = SRC.Table1ID
WHEN NOT MATCHED BY SOURCE THEN UPDATE
SET TGT.Active = CAST(0 AS BIT)
WHEN NOT MATCHED THEN INSERT (Table1ID, Q1A, Q2A, Q3A, Active)
VALUES (SRC.Table1ID, SRC.E1, REPLACE(SRC.E2, 'Data', ''), SRC.E3, CAST(1 AS BIT));
select *
from #Table1;
我能够使用下面的脚本精确匹配结果。希望这有帮助!如果你有任何问题,请告诉我
/*
Script to create the tables and merge the data
*/
-- drop table #Table1;
create table #Table1 (
Table1ID INT,
Q1A INT,
Q2A varchar(10),
Q3A INT,
Active BIT
);
INSERT INTO #Table1 VALUES (1, 2, 'Test', 1, 1);
INSERT INTO #Table1 VALUES (2, 3, 'Test2', 1, 1);
INSERT INTO #Table1 VALUES (3, 4, 'Test3', 1, 1);
INSERT INTO #Table1 VALUES (4, 5, 'Test4', 1, 1);
-- drop table #Table2;
create table #Table2 (
Table1ID INT,
E1 INT,
E2 varchar(10),
E3 INT
);
INSERT INTO #Table2 VALUES (1, 2, 'TestData1', 1);
INSERT INTO #Table2 VALUES (2, 3, 'TestData2', 1);
INSERT INTO #Table2 VALUES (3, 4, 'TestData3', 1);
INSERT INTO #Table2 VALUES (5, 5, 'TestData5', 1);
INSERT INTO #Table2 VALUES (6, 7, 'TestData6', 0);
;MERGE INTO #Table1 AS TGT
USING #Table2 AS SRC
ON TGT.Table1ID = SRC.Table1ID
WHEN NOT MATCHED BY SOURCE THEN UPDATE
SET TGT.Active = CAST(0 AS BIT)
WHEN NOT MATCHED THEN INSERT (Table1ID, Q1A, Q2A, Q3A, Active)
VALUES (SRC.Table1ID, SRC.E1, REPLACE(SRC.E2, 'Data', ''), SRC.E3, CAST(1 AS BIT));
select *
from #Table1;
您还可以使用变量代替表格,如下所示:
DECLARE @Table1ID INT = 1,
@E1 INT = 2,
@E2 varchar(10) = 'TestData1',
@E3 INT = 1;
;MERGE INTO #Table1 AS TGT
USING (VALUES(@Table1ID, @E1, @E2, @E3))
AS SRC (Table1ID, E1, E2, E3)
ON TGT.Table1ID = SRC.Table1ID
WHEN NOT MATCHED BY SOURCE THEN UPDATE
SET TGT.Active = CAST(0 AS BIT)
WHEN NOT MATCHED THEN INSERT (Table1ID, Q1A, Q2A, Q3A, Active)
VALUES (SRC.Table1ID, SRC.E1, REPLACE(SRC.E2, 'Data', ''), SRC.E3, CAST(1 AS BIT));
select *
from #Table1;
您是否正在尝试更新任何表,或者只是创建一个返回此结果的查询?正在更新表。您是否正在尝试更新任何表,或者只是创建一个返回此结果的查询?正在更新表。如果表2中的TableID是字符串而不是表,谢谢您的回答。我如何才能做到这一点。我们刚换了衣服,想看看是否可能。根据新的更改,我们得到了@strTable2Ids='1,2,3,5,6',请查看我的编辑,其中我使用变量代替了表。如果我在表2中得到的TableID是字符串而不是表,感谢您的回复。我如何才能做到这一点。我们刚换了衣服,想看看是否可能。根据新的更改,我们得到@strTable2Ids='1,2,3,5,6',请查看我的编辑,其中我使用变量代替表。