sql - 基于另一个表插入到第一个表
问题描述
我有以下人员表:
人们:
| 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 |
提前致谢!
解决方案
正如@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<>在这里摆弄
推荐阅读
- database - 在 Oracle WHEN CASE 中使用多个条件
- ios - 在 iOS uiwebview 中,您可以查看/捕获用户正在输入的内容
- c# - C# - FileHelpers:DateTime 变量的错误计算
- javascript - 如何在 React JS 中实现基于用户操作的通知
- java - 我的 Spring Boot 服务器返回 406 Http 错误代码
- c - char(包含单词)数组冒泡排序问题(c)
- selenium - 使用 etaoin 和 Clojure 的 Web UI 测试自动化,如何填充/查找相关元素?
- excel - 一个单元格中的单元格值 IF > 0
- c# - 如何使用包含运行时值的委托初始化事件?
- javascript - 如何向 JavaScript Date 对象添加年、月、日、小时、分钟或秒?