0

我正在使用一个表示树的 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 的那个。有没有这样的表达方式?或者有没有更好的方法来解决这个问题?

4

1 回答 1

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()id第 4 行末尾的 是一个相关子查询,它针对表中的每一行进行评估,对于没有删除任何子项的行,它的评估结果为 NULL。

我想知道是否可以通过使用两个查询来提高性能,首先将子查询(第 4 行)作为独立查询运行,向程序返回一个字典,其键是删除了孩子的父母的 id,值是它的多少正在删除儿童。但我的问题是如何在一个查询中做到这一点:)

更新:上述方法适用于家庭,但不要在工作中尝试

我应该更多地考虑@CL 的原始评论。尽管这个答案有效,但在包含数万行的真实 SQLite 数据库上的性能非常糟糕。

教训:像这个“答案”这样的花哨的 SQL 查询是有趣的脑筋急转弯,但在实践中,如果性能很重要,如果你有可用的真正编程语言,你应该改用简单的查询并用真正的语言进行处理。

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

于 2017-07-04T02:35:38.593 回答