我正在使用表示树的SQLite表。其列包括id
和parent
。当然,每个parent
值都是另一行的id
。
还有一个changeCount
列,对于在批量操作中删除的每个子项,我必须将其递增1。
例如,说
然后id = 5的行应该使其changeCount增加2,而id = 8的行应该将其changeCount增加1。
似乎应该有一种方法可以在一个查询中执行此操作。也许是这样的:
UPDATE myTable
SET changeCount = changeCount
+ (SELECT COUNT(*) FROM myTable
WHERE id IN (11,12,13) AND parent = XXXX);
表达式XXXX应该是对"当前"的引用。行;正在设置其changeCount的那个。有表达吗?或者有更好的方法解决这个问题吗?
答案 0 :(得分:0)
感谢@CL的评论,我在这里编辑了我以前工作但是凌乱的答案,看起来很不错:
UPDATE myTable
SET changeCount = changeCount
+ ifnull(
(SELECT theCount FROM (SELECT parent AS theParent, COUNT(*) AS theCount FROM myTable WHERE id IN (11,12,13) GROUP BY parent) WHERE theParent = id)
, 0);
ifnull()
的原因是第4行末尾的id
使得它成为相关子查询,对表中的每一行进行评估,对于没有任何行的行进行评估删除子项,它的计算结果为NULL。
我想知道是否可以通过使用两个查询来改进性能,首先将子查询(第4行)作为独立查询运行,向程序返回一个字典,其键是父母的id,子项被删除,值是如何它的许多孩子都被删除了。但我的问题是如何在一个查询中执行此操作:)
更新:以上是可以的,但不要在工作中尝试
我应该更多地考虑@CL的原始评论。虽然这个答案有效,但在包含数万行的真实SQLite数据库上的性能非常糟糕。
课程:花哨的SQL查询,例如此"回答"是有趣的脑筋急转弯,但在实践中,如果性能很重要,如果你有一个真正的编程语言,你应该使用简单的查询并用真正的语言进行处理强>
这就是我最终在这个问题出现的现实案例中所做的事情。