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
相关产品推荐
相关产品推荐

