如何从递归查询结果中删除冗余行,仅获取完整书籍系列拼接路径
修复后可实现需求的SQL语句
WITH RECURSIVE book_series AS ( -- 递归锚点:取每本没有前传的书作为系列起点(也就是不存在于Prequels表的bookID列的书籍) SELECT b.title AS full_series, b.bookID AS current_book_id FROM Books b WHERE NOT EXISTS ( SELECT 1 FROM Prequels p WHERE p.bookID = b.bookID ) UNION ALL -- 递归部分:每次往后拼接当前书籍的后续作品 SELECT CONCAT(bs.full_series, ' -> ', b.title), p.bookID AS current_book_id FROM book_series bs JOIN Prequels p ON p.prequelID = bs.current_book_id JOIN Books b ON b.bookID = p.bookID ) -- 过滤只保留完整系列:也就是当前书没有后续作品(不存在于Prequels表的prequelID列) SELECT full_series AS 完整书籍系列 FROM book_series WHERE NOT EXISTS ( SELECT 1 FROM Prequels p WHERE p.prequelID = current_book_id ) ORDER BY full_series;
逻辑说明
- 递归锚点直接定位系列的第一本书,避免后续额外补全开头书籍的逻辑,减少冗余计算。
- 从首本书开始顺着前传关系往后拼接每一本后续作品,每一步都记录当前拼接后的完整字符串和当前链的最后一本书ID。
- 结果仅保留链的最后一本书没有后续作品的记录,也就是最长的完整系列,自动过滤所有中间拼接结果。
使用你提供的权游系列样例数据执行后,会返回唯一符合要求的结果:A Game of Thrones -> A Clash of Kings -> A Storm of Swords -> A Feast for Crows -> A Dance with Dragons
内容的提问来源于stack exchange,提问作者user1
相关产品推荐
相关产品推荐

