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

SQLite.Swift嵌套查询报错:无法用Select<Bool>调用filter方法

解决SQLite.Swift中查询无父条目的子条目问题

你遇到的编译错误是因为parent.filter(child[ItemTable.parentId] == parent[ItemTable.id]).exists返回的是Select<Bool>类型,而filter方法需要的是Expression<Bool>类型的条件。另外你的逻辑也搞反了——我们需要的是NOT EXISTS,而不是EXISTS。

下面是正确的ORM实现方式,完美对应你想要的SQL语句:

// 定义表别名,这部分你原来的写法是对的
let child = ItemTable.table.alias("child")
let parent = ItemTable.table.alias("parent")

// 构造子查询:查找与当前子条目parent_id匹配的父条目
let parentSubquery = parent
    .select(parent[ItemTable.id])
    .filter(parent[ItemTable.id] == child[ItemTable.parentId])

// 筛选出父条目不存在的子条目:对exists子查询取反
let orphanedItemsQuery = child.filter(!parentSubquery.exists)

为什么这样写是对的?

  • parentSubquery.exists会生成EXISTS(...)的Expression<Bool>表达式,正好符合filter方法的参数要求
  • 加上!取反后,就对应了你SQL里的NOT EXISTS逻辑
  • 这段代码生成的SQL和你手动写的完全一致:
    SELECT * FROM items AS child WHERE NOT EXISTS (
        SELECT parent.id FROM items AS parent WHERE parent.id = child.parent_id
    )
    

你可以直接用这个orphanedItemsQuery来执行查询,比如用db.prepare(orphanedItemsQuery)获取结果。

内容的提问来源于stack exchange,提问作者Ala'a .H

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:02:06