SQLite:需要在更新中引用 "current" 行
SQLite : Need reference to "current" row in a UPDATE
我正在使用代表树的 SQLite table。它的列包括 id
和 parent
。当然,每个 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 应该是对 "current" 行的引用;正在设置其 changeCount 的那个。有表达吗?或者有更好的方法来解决这个问题吗?
感谢@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
使它成为一个相关的子查询,它针对 table 中的每一行进行评估,并且没有删除任何 children 的行,它的计算结果为 NULL。
我想知道是否可以通过使用两个查询来提高性能,首先 运行 子查询(第 4 行)作为一个独立的查询,向程序返回一个字典,其键是 parents children 被删除,值是它的 children 被删除的数量。但我的问题是如何在一个查询中执行此操作:)
更新:以上内容适用于家庭,但不要在工作中尝试
我应该更多地考虑@CL 的原始评论。虽然这个答案有效,但在包含数万行的真实 SQLite 数据库上的性能非常糟糕。
课程:像这样 "answer" 的奇特 SQL 查询是有趣的脑筋急转弯,但在实践中,如果性能很重要,如果你有一个 真实的 可用的编程语言,您应该使用简单的查询,并使用 真实的 语言进行处理。
这就是我在出现此问题的 real-life 案例中最终所做的事情。
我正在使用代表树的 SQLite table。它的列包括 id
和 parent
。当然,每个 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 应该是对 "current" 行的引用;正在设置其 changeCount 的那个。有表达吗?或者有更好的方法来解决这个问题吗?
感谢@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
使它成为一个相关的子查询,它针对 table 中的每一行进行评估,并且没有删除任何 children 的行,它的计算结果为 NULL。
我想知道是否可以通过使用两个查询来提高性能,首先 运行 子查询(第 4 行)作为一个独立的查询,向程序返回一个字典,其键是 parents children 被删除,值是它的 children 被删除的数量。但我的问题是如何在一个查询中执行此操作:)
更新:以上内容适用于家庭,但不要在工作中尝试
我应该更多地考虑@CL 的原始评论。虽然这个答案有效,但在包含数万行的真实 SQLite 数据库上的性能非常糟糕。
课程:像这样 "answer" 的奇特 SQL 查询是有趣的脑筋急转弯,但在实践中,如果性能很重要,如果你有一个 真实的 可用的编程语言,您应该使用简单的查询,并使用 真实的 语言进行处理。
这就是我在出现此问题的 real-life 案例中最终所做的事情。