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