SQL 两个表上的子查询或 JOIN,匹配一次删除的值
SQL subquery or JOIN on two tables, match to once-removed value
考虑这些表格:
基于id
...
- 比尔是约翰的老板
- 汉克是安迪和亚历克斯的老板
writers
:
id
name
boss_id
1
John
2
2
Bill
2
3
Andy
4
4
Hank
4
5
Alex
4
writers
papers
他们写...
papers
:
id
title
writer_id
1
Boston
1
2
Chicago
4
3
Cisco
3
4
Seattle
2
5
North
5
我需要一个 SQL 查询,该查询将为 writers
为 Hank 工作的每篇论文 return papers.*
(id = 4
==> boss_id = 4
).这恰好包括汉克本人,因为他注册为自己的老板,但这并不那么重要。
期望的输出:
id
title
writer_id
2
Chicago
4
3
Cisco
3
5
North
5
我所拥有的,没有工作的希望:
SELECT * FROM papers p WHERE ( writers w AS p.writer_id JOIN w.boss_id = 4 );
您正走在解决问题的正确轨道上。在这里我分享两种方法:一种是使用子查询,另一种是连接两个表。
架构和插入语句:
create table writers( id int, name varchar(200), boss_id int);
insert into writers values( 1,'John',2);
insert into writers values( 2,'Bill',2);
insert into writers values( 3,'Andy',4);
insert into writers values( 4,'Hank',4);
insert into writers values( 5,'Alex',4);
create table papers ( id int, title varchar(200),writer_id int);
insert into papers values( 1,'Boston',1);
insert into papers values( 2,'Chicago',4);
insert into papers values( 3,'Cisco' ,3);
insert into papers values( 4,'Seattle',2);
insert into papers values( 5,'North' ,5);
查询 1(使用子查询):
SELECT * FROM papers p WHERE writer_id in ( select id from writers where boss_id = 4 );
输出:
id
title
writer_id
2
Chicago
4
3
Cisco
3
5
North
5
查询 2(使用连接):
select p.* from papers p
inner join writers w on p.writer_id=w.id
where w.boss_id=4
输出:
id
title
writer_id
3
Cisco
3
2
Chicago
4
5
North
5
db<>fiddle here
您可以使用作者 table 主键和论文 table 外键将两个 table 连接在一起,然后在 where 子句中指定 boss_id。
SElECT p.*
FROM papers p
INNER JOIN writers w ON p.writer_id = w.id
WHERE w.boss_id = 4
考虑这些表格:
基于id
...
- 比尔是约翰的老板
- 汉克是安迪和亚历克斯的老板
writers
:
id | name | boss_id |
---|---|---|
1 | John | 2 |
2 | Bill | 2 |
3 | Andy | 4 |
4 | Hank | 4 |
5 | Alex | 4 |
writers
papers
他们写...
papers
:
id | title | writer_id |
---|---|---|
1 | Boston | 1 |
2 | Chicago | 4 |
3 | Cisco | 3 |
4 | Seattle | 2 |
5 | North | 5 |
我需要一个 SQL 查询,该查询将为 writers
为 Hank 工作的每篇论文 return papers.*
(id = 4
==> boss_id = 4
).这恰好包括汉克本人,因为他注册为自己的老板,但这并不那么重要。
期望的输出:
id | title | writer_id |
---|---|---|
2 | Chicago | 4 |
3 | Cisco | 3 |
5 | North | 5 |
我所拥有的,没有工作的希望:
SELECT * FROM papers p WHERE ( writers w AS p.writer_id JOIN w.boss_id = 4 );
您正走在解决问题的正确轨道上。在这里我分享两种方法:一种是使用子查询,另一种是连接两个表。
架构和插入语句:
create table writers( id int, name varchar(200), boss_id int);
insert into writers values( 1,'John',2);
insert into writers values( 2,'Bill',2);
insert into writers values( 3,'Andy',4);
insert into writers values( 4,'Hank',4);
insert into writers values( 5,'Alex',4);
create table papers ( id int, title varchar(200),writer_id int);
insert into papers values( 1,'Boston',1);
insert into papers values( 2,'Chicago',4);
insert into papers values( 3,'Cisco' ,3);
insert into papers values( 4,'Seattle',2);
insert into papers values( 5,'North' ,5);
查询 1(使用子查询):
SELECT * FROM papers p WHERE writer_id in ( select id from writers where boss_id = 4 );
输出:
id | title | writer_id |
---|---|---|
2 | Chicago | 4 |
3 | Cisco | 3 |
5 | North | 5 |
查询 2(使用连接):
select p.* from papers p
inner join writers w on p.writer_id=w.id
where w.boss_id=4
输出:
id | title | writer_id |
---|---|---|
3 | Cisco | 3 |
2 | Chicago | 4 |
5 | North | 5 |
db<>fiddle here
您可以使用作者 table 主键和论文 table 外键将两个 table 连接在一起,然后在 where 子句中指定 boss_id。
SElECT p.*
FROM papers p
INNER JOIN writers w ON p.writer_id = w.id
WHERE w.boss_id = 4