2017-07-03 42 views
0

我正在使用代表树的SQLite表。其专栏包括idparent。当然,每个parent的值是另一行的idSQLite:需要参考UPDATE中的“当前”行

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

例如,说

  • 行编号为11,12和13将要在一个批量操作将被删除。
  • id = 11和id = 12的行都具有相同的父级= 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应该是对“当前”行的引用;那正在设置其变化数量。有没有一个表达?还是有更好的方法来解决这个问题?

+1

SQLite是一个嵌入式数据库,旨在与“真实”编程语言一起使用。为什么要避免多个SQL语句? –

+0

有趣的评论@CL!说实话,我的98%的经验是用'真正'的编程语言。对于SQLite,我一直都是一个简单的SELECT和UPDATE类型的人,羡慕那些似乎可以通过单一花哨的SQL语句表达相当复杂的需求的数据库专家。当我遇到这个需求时,我认为这只是中间级别的,所以我会给一些花哨的SQL一个镜头。也许我低估了这个要求的难度? –

回答

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,子项被删除,值为有多少儿童被删除。但我的问题是如何在一个查询中执行此操作:)

+1

[ifnull()](http://www.sqlite.org/lang_corefunc.html#ifnull)可能会有所帮助。 –

+0

确实如此,@CL!关于你对这个问题的评论,有点讽刺的是我所处理的'真正'的编程语言都没有这样的功能。 –