首页 > 解决方案 > 基于另一个表插入到第一个表

问题描述

我有以下人员表:

人们:

| id   | f_name  | l_name    | role  |
|:-----|:-------:|:---------:| -----:|
| 1    | John    | Nathan    | 1     |
| 2    | Brand   |  Ba       | 1     |
| 3    | Bob     |  Do       | 2     |
| 4    | Alice   |  Sia      | 1     |

和用户表:

用户:

| id   | f_name  | l_name | role  |
|:-----|:-------:|:------:| -----:|
| 1    | John    | Tom    |   1   |

我希望 People 表中角色 = 1 的任何人都将在 Users 表中,因此如果他们不在 users 表中,我将它们插入表中,如果它们确实存在,我会更新他们的名字和姓氏和角色基于基于 id 列的 People 表

期望的结果:

用户:

| id   | f_name  | l_name    | role  |
|:-----|:-------:|:------:   | -----:|
| 1    | John    | Nathan    |   1   |
| 2    | Brand   | Ba        |   1   |
| 3    | Bob     | Do        |   1   |

提前致谢!

标签: sqlsql-servertsqlmerge

解决方案


正如@Larnu 所建议的,您可以在sql server 中使用MERGE:

模式和插入语句

create table people( id int ,f_name  varchar(25), l_name varchar(25),role  int);
insert into people values( 1    ,'John', 'Nathan', 1);     
insert into people values( 2    ,'Brand','Ba'    , 1);     
insert into people values( 3    ,'Bob',  'Do'    , 2);     
insert into people values( 4    ,'Alice','Sia'   , 1);     


create table Users( id int,  f_name varchar(25), l_name varchar(25), role int);
insert into Users values( 1    ,'John' ,'Tom' ,1 );

合并查询:

MERGE Users AS TARGET
USING people AS SOURCE 
ON (TARGET.id = SOURCE.id) 
--When records are matched, update the records 
WHEN MATCHED 
THEN UPDATE SET TARGET.f_name = SOURCE.f_name, TARGET.l_name = SOURCE.l_name 
--When no records are matched, insert the incoming records from source table to target table
WHEN NOT MATCHED BY TARGET 
THEN INSERT (id, f_name, l_name,role) VALUES (SOURCE.id, SOURCE.f_name, SOURCE.l_name, SOURCE.role);

合并后:

  select * from users;

输出:

ID f_name l_name 角色
1 约翰 弥敦道 1
2 1
3 鲍勃 2
4 爱丽丝 新航 1

db<>在这里摆弄

如果您只想合并具有角色 1 的人员:

模式和插入语句:

 create table people( id int ,f_name  varchar(25), l_name varchar(25),role  int);
 insert into people values( 1    ,'John', 'Nathan', 1);     
 insert into people values( 2    ,'Brand','Ba'    , 1);     
 insert into people values( 3    ,'Bob',  'Do'    , 2);     
 insert into people values( 4    ,'Alice','Sia'   , 1);     
 
 
 create table Users( id int,  f_name varchar(25), l_name varchar(25), role int);
 insert into Users values( 1    ,'John' ,'Tom' ,1 );

合并查询:

 MERGE Users AS TARGET
 USING (select * from people where role=1) AS SOURCE 
 ON (TARGET.id = SOURCE.id ) 
 --When records are matched, update the records 
 WHEN MATCHED 
 THEN UPDATE SET TARGET.f_name = SOURCE.f_name, TARGET.l_name = SOURCE.l_name , TARGET.role=SOURCE.role
 --When no records are matched, insert the incoming records from source table to target table
 WHEN NOT MATCHED BY TARGET 
 THEN INSERT (id, f_name, l_name,role) VALUES (SOURCE.id, SOURCE.f_name, SOURCE.l_name, SOURCE.role);

合并后:

 select * from users;

输出:

ID f_name l_name 角色
1 约翰 弥敦道 1
2 1
4 爱丽丝 新航 1

db<>在这里摆弄


推荐阅读