2017-07-03 2 views
0

私はツリーを表すSQLiteテーブルを使っています。列にはidparentが含まれます。もちろん、各parentの値は別の行のidです。SQLite:UPDATEの "current"行への参照が必要です

また、changeCount列があります。バルク操作で削除された各子に対して1ずつ増分する必要があります。

たとえば、IDと

  • 行11、12及び13は、バルク操作で削除されようとしていると言います。
  • id = 11およびid = 12の行は、両方とも同じparent = 5を持ちます。
  • id = 13のローはparent = 8です。

次にID = 5の行は、そのchangeCountが2だけインクリメント有していなければならない、および実行する方法がなければならないように、ID = 8を有する行は、そのchangeCount 1.

インクリメント有していなければならないそれはそうこれは1つのクエリでおそらく次のようなものでしょう:

UPDATE myTable 
    SET changeCount = changeCount 
    + (SELECT COUNT(*) FROM myTable 
     WHERE id IN (11,12,13) AND parent = XXXX); 

式XXXXは、「現在の」行への参照である必要があります。 changeCountが設定されているものそれについての表現はありますか?あるいは、この問題に対するより良いアプローチがありますか? @CLによってコメントに

+1

SQLiteは組み込みデータベースであり、「実」プログラミング言語と共に使用するように設計されています。なぜあなたは複数のSQL文を避けたいのですか? –

+0

面白いコメント、@CL!正直言って私の経験の98%は「本当の」プログラミング言語です。 SQLiteでは、私はいつもシンプルなSELECTとUPDATEのような種類の人物であり、巧妙な単一のSQLステートメントでかなり複雑な要件を表現できるデータベースガウスを羨ましく思っています。この要件に遭遇したとき、私は中間レベルに過ぎないと思ったので、派手なSQLに挑戦しました。たぶん私はこの要件の難しさを過小評価しましたか? –

答えて

0

おかげで、私は、ここでかなりまともに見えるものに私の以前の作業が、厄介な答えを編集した:

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に評価されます。

代わりに2つのクエリを使用し、最初にサブクエリ(4行目)をスタンドアロンクエリとして実行し、プログラムに、子が削除され、値がある親のidsのキーである辞書を返すことで、削除されている子どもの数。しかし、私の質問は、1つのクエリでこれを行う方法でした:)

+1

[ifnull()](http://www.sqlite.org/lang_corefunc.html#ifnull)が役立つ可能性があります。 –

+0

それは本当に、@ CL!質問に対するあなたのコメントに関して、私が扱った「本当の」プログラミング言語のどれもがそのような機能を持っていないことは皮肉なことです。 –

関連する問題