编写SQL SELECT语句识别与Bob合著全部著作的人员
没问题,我来帮你搞定这个SQL需求,顺便把思路拆解清楚~
找出与Bob合著过其所有著作的作者:SQL实现与思路
首先咱们得明确需求:要找的是那些和Bob一起写过他每一本书的作者——也就是说,Bob参与的每本书里,这个作者都得在场,不能有一本落下。
先看给定的实例数据:Bob参与了Book1和Book2,Book3没他。那符合要求的就是Ada和Carl(他俩两本书都在),Dave只在Book2出现,所以不符合。
方法一:用CTE统计数量实现
这个方法逻辑清晰,分步拆解:
-- 先把Bob参与的所有书的ID提取出来 WITH BobBooks AS ( SELECT BID FROM your_table_name -- 记得替换成你的实际表名 WHERE AID = 'Bob' ), -- 统计每个作者和Bob合著的不同书籍数量(排除Bob自己) AuthorCoCount AS ( SELECT a.AID, COUNT(DISTINCT a.BID) AS co_book_num FROM your_table_name a JOIN BobBooks b ON a.BID = b.BID WHERE a.AID != 'Bob' GROUP BY a.AID ), -- 算出Bob总共有多少本著作 BobTotalBooks AS ( SELECT COUNT(DISTINCT BID) AS total_num FROM BobBooks ) -- 筛选出合著数量等于Bob著作总数的作者 SELECT a.AID FROM AuthorCoCount a JOIN BobTotalBooks b ON a.co_book_num = b.total_num;
逻辑拆解:
BobBooks:先把Bob的所有著作ID捞出来,这里就是Book1和Book2。AuthorCoCount:逐个统计其他作者和Bob一起合著过几本书,比如Ada是2本,Carl是2本,Dave是1本。BobTotalBooks:算出Bob总共有2本著作。- 最后一步:把合著数量等于2的作者挑出来,就是我们要的结果。
方法二:用双重NOT EXISTS实现(更简洁)
这个写法用逻辑判断代替统计,核心是“不存在Bob参与的某本书,当前作者没参与”:
SELECT DISTINCT a.AID FROM your_table_name a WHERE a.AID != 'Bob' AND NOT EXISTS ( -- 检查是否存在Bob参与但当前作者没参与的书 SELECT 1 FROM your_table_name b WHERE b.AID = 'Bob' AND NOT EXISTS ( SELECT 1 FROM your_table_name c WHERE c.BID = b.BID AND c.AID = a.AID ) );
逻辑拆解:
外层先排除Bob自己,然后用NOT EXISTS确保:没有任何一本Bob参与的书,是当前作者没参与的——换句话说,当前作者参与了Bob的所有书,完全符合需求。
内容的提问来源于stack exchange,提问作者Rogue_02
相关产品推荐
相关产品推荐

