SQLite:需要参考"当前"行更新

时间:2017-07-03 23:02:25

标签: sqlite subquery in-subquery

我正在使用表示树的SQLite表。其列包括idparent。当然,每个parent值都是另一行的id

还有一个changeCount列,对于在批量操作中删除的每个子项,我必须将其递增1。

例如,说

  • 将在批量操作中删除ID为11,12和13的行。
  • id = 11且id = 12的行都具有相同的parent = 5.
  • id = 13的行有parent = 8。

然后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的那个。有表达吗?或者有更好的方法解决这个问题吗?

1 个答案:

答案 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查询,例如此"回答"是有趣的脑筋急转弯,但在实践中,如果性能很重要,如果你有一个真正的编程语言,你应该使用简单的查询并用真正的语言进行处理

这就是我最终在这个问题出现的现实案例中所做的事情。