2016-07-10 4 views
1

以下のすべてのサブノードと一緒に選択したノードを削除する方法を簡素化または改善できますか?データベースツリーのノードを削除する

CREATE TABLE cats (cat_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
        cat_pid INTEGER NOT NULL, 
        cat_name VARCHAR(40) 
       ) 

クエリ:

表は次のようになります可能であれば

WITH tree (cat_id, cat_pid, level, cat_name) AS 
(
    SELECT cat_id, cat_pid, 0 as level, cat_name 
    FROM cats 
    WHERE cat_pid = :cat_id --parameter from FreePascal/Lazarus 

    UNION ALL 

    SELECT cats.cat_id, cats.cat_pid, tree.level + 1, cats.cat_name 
    FROM cats 
    INNER JOIN tree ON tree.cat_id = cats.cat_pid 
) 
DELETE FROM cats 
WHERE cat_id IN (SELECT cat_id FROM tree) 
    OR cat_id=:cat_id 

、私はDELETE文でORを取り除くしたいと思いますが、どのように知りません。

実際には、外部キー/カスケード削除を使用して削除を実行できる場合は、非常に興味深いものになります。

データベースはSQLiteです。

+0

、ルックス:

WHERE cat_pid = :cat_id 

はちょうどその猫自身が何を始めます'cat_pid'を正しく設定してください。正しく動作するはずです。https://www.sqlite.org/foreignkeys.html#fk_actions – Blorgbeard

+0

私は試してみましたが、挿入は「外部KEY制約に失敗しました。 cat_pidは次のように設定されました:cat_pid INTEGER NOT NULL REFERENCES cats(cat_id)ON DELETE CASCADE – Rimfire

答えて

1

CTEは、その指定されたIDである猫で始まる:SQLiteのは、削除CASCADE`に `サポートしているようにあなた場合

WHERE cat_id = :cat_id