You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写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;

逻辑拆解:

  1. BobBooks:先把Bob的所有著作ID捞出来,这里就是Book1和Book2。
  2. AuthorCoCount:逐个统计其他作者和Bob一起合著过几本书,比如Ada是2本,Carl是2本,Dave是1本。
  3. BobTotalBooks:算出Bob总共有2本著作。
  4. 最后一步:把合著数量等于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 07:12:30