查询文档及其所有子文档的反链(残缺版)

0 前情提要

思源 SQL 新人指南:SQL 语法 + Query + 模板 - 链滴所提供的“查询文档及其所有子文档的反链”语句,就是字面含义,没有针对容器块进行适配。其查询效果和当前的思源笔记反链面板显示不同。

针对整理和写作,实在无法忍受临时文档的反链转移到主文档后,在主文档进行反链批量查看和处理的这个反复操作。反复 push deepseek 写出一个 sql 查询,实现一次性查看指定文档 id 及其不限制层级的所有子文档 id 的反链(类反链面板)。

1 残缺警告

简明扼要:遇到下面这四种块类型,可能出现 bug。

无序列表块 容器块
有序列表块 容器块
任务列表块 容器块
列表项块 容器块

残缺原因:

仅针对于反链所在的块取其 parent_id(容器块),没有针对列表项块进行递归查询的优化。

为什么不做优化:

  1. 优化后,查询性能很可能受到有一定程度的拖累。
  2. 个人笔记使用偏好,没有这种需求。

补救方式:

在扔入 sql 小助手的 prompt 前提下,将残缺原因和下方的 sql 代码扔给 deepseek,重新调教新代码。

2 SQL 代码(可直接使用嵌入块查询;可使用文档流插件打开)

注意:

  1. 指定文档 id改为你的指定文档 id。
  2. 在代码末尾有一句limit 5,针对返回结果进行了限制。
-- 最终返回块始终来自 blocks 表,完美适配思源渲染 SELECT * FROM blocks WHERE id IN ( -- 情况1:反链位于容器块中 → 返回容器块 SELECT parent.id FROM blocks AS ref_block JOIN blocks AS parent ON ref_block.parent_id = parent.id WHERE ref_block.id IN ( SELECT block_id FROM refs WHERE def_block_id IN ( SELECT id FROM blocks WHERE path LIKE "%指定文档id%" ) ) -- 容器块类型判定逻辑 AND parent.type IN ('s','b','l','av') -- 超级块/引述块/列表块/数据库 AND parent.type != 'd' -- 排除文档容器 UNION ALL -- 情况2:反链不在容器块中 → 返回原始块 SELECT ref_block.id FROM blocks AS ref_block LEFT JOIN blocks AS parent ON ref_block.parent_id = parent.id WHERE ref_block.id IN ( SELECT block_id FROM refs WHERE def_block_id IN ( SELECT id FROM blocks WHERE path LIKE "%20250424104910-q34fpnf%" ) ) -- 排除容器块场景 AND ( parent.type NOT IN ('s','b','l','av') -- 父块不是容器 OR parent.type = 'd' -- 父块是文档块 OR parent.id IS NULL -- 无父块(文档根) ) ) LIMIT 5
3 询问步骤
  1. SQL 小助手 - 链滴:喂入对应的 prompt

  2. select * from blocks where id in ( select block_id from refs where def_block_id in ( select id from blocks where path like "%20250424104910-q34fpnf%" ) )

    针对于所查询到的反链,检查其是位于非文档块的容器块之中;如果是,则取其容器块;如果不是,则取反链本身。我期望使用思源笔记自带的块进行渲染,也就是说,以 select * 为收尾。

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    25948 引用 • 107560 回帖
  • SQL
    129 引用 • 396 回帖 • 3 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 学习了。

    不懂就问:询问步骤是做什么用的?

    1 回复
  • PearlLin via Android

    问 deepseek 的。

    我琢磨有人喜欢反向把代码扔进去让 ds 解释;也有人喜欢开深度思考看 ds 正向推理,就顺手把正确问法挑出来放最后了。