0 前情提要
在思源 SQL 新人指南:SQL 语法 + Query + 模板 - 链滴所提供的“查询文档及其所有子文档的反链”语句,就是字面含义,没有针对容器块进行适配。其查询效果和当前的思源笔记反链面板显示不同。
针对整理和写作,实在无法忍受临时文档的反链转移到主文档后,在主文档进行反链批量查看和处理的这个反复操作。反复 push deepseek 写出一个 sql 查询,实现一次性查看指定文档 id 及其不限制层级的所有子文档 id 的反链(类反链面板)。
1 残缺警告
简明扼要:遇到下面这四种块类型,可能出现 bug。
无序列表块 | 容器块 |
---|---|
有序列表块 | 容器块 |
任务列表块 | 容器块 |
列表项块 | 容器块 |
残缺原因:
仅针对于反链所在的块取其 parent_id(容器块),没有针对列表项块进行递归查询的优化。
为什么不做优化:
- 优化后,查询性能很可能受到有一定程度的拖累。
- 个人笔记使用偏好,没有这种需求。
补救方式:
在扔入 sql 小助手的 prompt 前提下,将残缺原因和下方的 sql 代码扔给 deepseek,重新调教新代码。
2 SQL 代码(可直接使用嵌入块查询;可使用文档流插件打开)
注意:
- 将指定文档 id改为你的指定文档 id。
- 在代码末尾有一句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 询问步骤
-
SQL 小助手 - 链滴:喂入对应的 prompt
-
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 * 为收尾。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于